实体框架延迟加载和更新模型

时间:2011-11-22 11:07:25

标签: c# asp.net-mvc entity-framework

我定义了一些这样的模型(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 个答案:

答案 0 :(得分:4)

当您在断点处停留并检查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();

您应该注意,第一个选项只会在数据库中命中一次。在第二个选项中,您将两次点击数据库。应根据您的具体情况考虑这一点 您可以在此博客文章中阅读有关使用相关实体的所有信息: Using DbContext in EF 4.1 Part 6: Loading Related Entities