实体框架更新更改

时间:2014-02-21 20:30:57

标签: c# entity-framework

我有一个具有自我关系的实体模型(父/子)。我的名为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,这不再起作用了,我再次从数据库中获取实体以获取相关的父实体。这是因为对延迟加载的更改?我应该做些什么。

1 个答案:

答案 0 :(得分:3)

不同之处在于,在EF 4中,实体是由成堆的代码生成的,这些代码负责更改通知和延迟加载。从那时起,带有POCO的DbContext API已成为标准。

如果你想要与旧的'richhed'实体相同的行为,你必须确保延迟加载可以在许多条件下发生:

  • 上下文必须允许延迟加载。默认情况下会执行此操作,但您可以将其关闭。
  • 您想要延迟加载的导航属性必须具有virtual修饰符,因为
  • EF必须创建动态代理。这些代理有点类似于旧生成的实体,因为它们能够执行延迟加载,因为它们会覆盖原始类的虚拟成员。

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

ArticleTable newEntity= dbContext.ArticleTables.Create();

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

  

如果基础上下文配置为创建代理,并且实体类型符合创建代理的要求。