Entity Framework ленивая загрузка и обновление модели - PullRequest
2 голосов
/ 22 ноября 2011

Я определил некоторые модели, подобные этой (Entity Framework Code-First):

public class A
{
  public int Id { get; set; }
  public int Name { get; set; }
}

public class B
{
  public int Id { get; set; }
  public int Name { get; set; }
  public virtual A ObjectA { get; set; }
}

// model update sample code
public void UpdateModel(int id, string name)
{
  B objB = GetObjBByIdUsingLINQ(id); // this function gets the object using LINQ
  if (objB != null) // <-- if you do a breakpoint here and inspect objB, objB.A != null
  {
    objB.Name = name;
    dbContext.Entry(objB).State = EntityState.Modified;
    dbContext.SaveChanges(); // <-- DbEntityValidationException here because objB.A == null
  }
}

Когда я загружаю модель B из базы данных, я изменяю только имя и обновляю ее, я получаюследующая ошибка: Поле ObjectA является обязательным.

Я думаю, это потому, что ObjectA загружен с отложенным доступом.Однако, когда я добавляю точку останова после загрузки B из базы данных, а затем просматриваю содержимое B в проводнике переменных, загружается A, и обновление B не выдает ошибку.

Есть идеи, как решить эту проблему?

1 Ответ

4 голосов
/ 22 ноября 2011

Происходит следующее: когда вы останавливаетесь в точке останова и проверяете значение свойства ObjectA внутри вашего objB, вы явно загружаете свойство.

В методе GetObjBByIdUsingLINQ(id) вы должны использовать Include для загрузки вашей собственности, например:

var objB = from b in dbContext.Bs.Include("ObjectA")
           where b.Id == id
           select b;

Или вы можете явно загрузить свойство, вместо:

dbContext.Entry(objB).Reference("ObjectA").Load();

Обратите внимание, что первый вариант попадет в базу данных только один раз. Во втором варианте вы попадете в базу данных дважды. Это следует учитывать в зависимости от вашего конкретного случая.
Вы можете прочитать все о работе со связанными объектами в этом блоге: Использование DbContext в EF 4.1, часть 6: загрузка связанных объектов .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...