В БД не сохраняются данные и не выдается никаких ошибок. - PullRequest
1 голос
/ 25 января 2012

Мой DAL основан на коде Entity Framework First.

У меня есть модель поста и модель тега. К одному сообщению может быть прикреплено несколько сообщений.

Вот мой пост:

public class Post 
{
    [Key]
    public int PostID { get; set; }
    ...
    public virtual ICollection<Tag> Tags { get; set; }
}

Вот мой тег:

public class Tag
{
    [Key]
    public int TagID { get; set; }

    [Required, StringLength(50)]
    public string Name { get; set; }

    public virtual ICollection<Post> Posts { get; set; }
}

Когда я сохраняю свое сообщение, у меня нет ошибок, но в БД ничего не сохраняется.

enter image description here

Как вы можете видеть на скриншоте выше, TagID равен 0, и я не знаю почему ???

enter image description here

Есть идеи? Предложения? * * 1023

Мои таблицы правильно созданы в Sql Server.

Спасибо.

PS: Мой код должен быть в порядке, потому что я копирую / вставляю его из другого места (где он работает).


UPDATE

Вот код для обновления тегов сущностей (под конкретным постом)

    Tag t = m_TagRepository.GetTag(tag.Trim().ToUpper());
    if (t == null) t = new Tag { Name = tag.Trim().ToUpper() };
    post.Tags.Add(t);

Вот код для сохранения изменений в сообщении (и тег ниже)

    public void SavePost(Post post)
    {
        if (post.PostID == 0)
        {
            m_Context.Posts.Add(post);
        }
        else
        {
            var entry = m_Context.Entry(post);
            entry.State = EntityState.Modified;
        }            
        m_Context.SaveChanges();
    }

Я получаю сообщение обратно со страницы редактирования:

    [Authorize, HttpPost, ValidateInput(false), Theme("Admin")]
    public ActionResult Edit(PostFullViewModel postToEdit)
    {
        if (!ModelState.IsValid)
            return View();

        Post post = Mapper.Map<PostFullViewModel, Post>(postToEdit);
        m_PostBusiness.UpdateTags(post, postToEdit.TagString);
        m_PostBusiness.SavePost(post);
        TempData.SetStatusMessage(Strings.Post_SavedSuccessfully);

        return RedirectToAction("Manage");
    }

Ответы [ 2 ]

1 голос
/ 26 января 2012

Это частая проблема, которую задают много раз.Вы получили свою модель просмотра поста из HTTP-запроса и сопоставили ее с вашей сущностью поста, но эта сущность была создана вне контекста EF.Затем вы добавили тег к этому неприкрепленному сообщению, прикрепили сообщение и изменили состояние сообщения на измененное.

Теперь, где проблема?Проблема в модели состояния EF.Каждая сущность и каждая независимая ассоциация имеет свое собственное состояние.Изменение сообщения на измененное только сообщило EF, что сообщение было обновлено, но тег и отношение между тегом и сообщением остаются неизменными.Из-за этого EF будет сохранять только сообщения.

Простое решение для конкретного случая заключается в следующем:

var post = GetPostFromYourRequest();
context.Posts.Attach(post);
ProcessTags(post, postToEdit);
context.SaveChanges();

Вся сложная логика заключается в тегах процесса.Здесь все зависит от того, что вы хотите сделать.Если вы хотите создавать только новые теги, вы будете делать то, что сделали сейчас (вы должны загрузить существующий тег из базы данных с тем же контекстом, который вы использовали для прикрепления публикации).

Если вы хотите выполнить какую-либо сложную операцию, вам следует загрузить исходное сообщение со всеми тегами из базы данных и объединить вашу модель входящего представления в исходное состояние.Например, удалить связь между существующей записью и тегами очень сложно, не загружая текущее состояние из базы данных.Подробное объяснение проблемы: здесь .

0 голосов
/ 26 января 2012
  1. Выясните, почему TagID равен 0 - если TagID равен 0, вы не устанавливаете состояние как измененное, поэтому ничего не сохраняется.
  2. Запустите профилировщик SQL, чтобы увидеть, что происходит на стороне SQL (вероятно, ничего из-за 1)
  3. Пройдите превосходный урок Тома EF / MVC
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...