Проблема отложенной загрузки и обязательного атрибута: обязательное поле XXX - PullRequest
3 голосов
/ 14 апреля 2011

У меня есть класс Comment с, среди прочего, свойством Author:

public class Comment : IEquatable<Comment>
{
    public int ID { get; set; }

    [Required]
    public virtual User Author { get; set; }

    // More properties here
}

Я хочу, чтобы пользователи могли «лайкать» комментарии, как здесь, в StackOverflow. Для этого в моем CommentController есть следующее действие:

public virtual ActionResult Like(int id)
{
    var comment = _session.Single<Comment>(c => c.ID == id);
    comment.Likes++;

    _session.CommitChanges();

    return Json(new { comment.Likes });
}

Каждый раз, когда я вызываю это действие, я получаю следующую ошибку проверки:

Поле автора обязательно для заполнения.

Объект Comment взят из базы данных, поэтому имеет автора. Самое смешное, что всякий раз, когда я использую отладчик Visual Studio, чтобы проверить, действительно ли отсутствует Author, ошибка проверки не срабатывает.

Правильно ли я предположил, что проблема в том, что ленивая загрузка свойства Author никогда не происходит? Если да, то как я могу, только для этой ситуации, принудительно заполнить все свойства навигации? (В противном случае я хочу продолжить работу с отложенной загрузкой)

Какой самый лучший способ решить эту проблему? Я даже на правильном пути? И почему не происходит отложенная загрузка, в то время как EF явно требует, чтобы она сохраняла объект?

Любая помощь будет оценена.

Ответы [ 2 ]

2 голосов
/ 14 апреля 2011

Вы можете использовать Include, чтобы быстро получить связь в контексте данных.

context.Comments.Include("Author").Single<Comment>(c => c.ID == id);
0 голосов
/ 14 апреля 2011

У меня была похожая проблема. Ниже должно работать (с включенной LazyLoading).

public virtual ActionResult Like(int id)
{

   var comment = _session.Single<Comment>(c => c.ID == id);
   comment.Likes++;

   if(TryUpdateModel(comment))
   {

       _session.CommitChanges();

   }
   return Json(new { comment.Likes });
}
...