【问题标题】:Entity framework update change实体框架更新变更
【发布时间】:2017-07-18 23:04:24
【问题描述】:

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

【问题讨论】:

    标签: c# entity-framework


    【解决方案1】:

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

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

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

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

    ArticleTable newEntity= dbContext.ArticleTables.Create();
    

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

    如果底层上下文被配置为创建代理并且实体类型满足创建代理的要求。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-03-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-10
      • 1970-01-01
      • 2023-01-24
      • 2015-12-20
      相关资源
      最近更新 更多