2014-02-21 136 views
2

我有一个具有自我关系的实体模型(父/子)。我的名为Article的实体有一个名为parent的属性。这个父母实际上是关系,ParentID是关系中的字段。在EF 4我这样做:实体框架更新更改

using (var dbContext= new DataBaseModel()) 
{ 
    ArticleTable newEntity= new ArticleTable(); 
    newEntity.name="childArt"; 
    newEntity.ParentID = 1; 
    dbContext.ArticleTable.Add(newEntity); 
    dbContext.SaveChanges(); 

    //after calling save I can do this 
    var parentName = newEntity.Parent.Name; 
} 

实体框架6,这不工作了,我为了得到相关的父实体再次从数据库中获取的实体。这是因为懒惰加载的变化?我应该做什么不同。

回答

3

不同之处在于,在EF 4中,实体是通过一堆代码来生成的,这些代码负责处理更改通知和延迟加载。此后,带有POCO的DbContext API已成为标准。

如果你想相同的行为与旧的“富”的实体,您必须确保延迟加载可以通过一些条件发生:

  • 上下文必须允许延迟加载。它默认是这样做的,但你可以关闭它。
  • 您希望延迟加载的导航属性必须具有virtual修饰符,因为
  • EF必须创建动态代理。这些代理有点类似于旧生成的实体,因为它们可以执行延迟加载,因为它们会覆盖原始类的虚拟成员。

最后(也许是第二个)点可能是您唯一需要注意的地方。如果您通过new创建一个新对象,它只是一个无法进行延迟加载的POCO对象。但是,如果您要创建代理,则会发生延迟加载。幸运的是,有一个简单的方法来创建一个代理:

ArticleTable newEntity= dbContext.ArticleTables.Create(); 

DbSet<T>.Create()将创建动态代理 -

如果底层的背景下被配置为创建代理和实体类型符合创建代理的要求。