新添加的对象的实体对象,而不是动态代理实体框架

时间:2018-02-04 12:37:35

标签: entity-framework entity-framework-6 ef-code-first lazy-loading

我有一个存储库,其中包含添加和搜索方法

   public virtual void Add(T obj)
    {
        _table.Attach(obj);
        _table.Add(obj);
    }


     public virtual IEnumerable<T> Search(Expression<Func<T, bool>> predicate)
    {
        return _db.Set<T>().Where(predicate);
    }

然后在我的控制器上,在我使用添加方法添加客户备注的新对象并保存更改后,我使用搜索来检索基于客户ID的备注,我得到一个列表如下图所示,新添加的对象是poco类型我没有加载类和所有虚拟导航属性我使用include做了一个解决方法,有解释为什么EF这样做

Quick watch List for retrieved list from search method

1 个答案:

答案 0 :(得分:2)

EF仅为其创建的实体实例创建代理 - 在实现查询时隐式实现,或在使用DbSet.Create方法时显式实现。接收用户提供的对象实例的任何方法(如AddRemoveAttachEntry等)都不会修改(使用代理包装)传递的对象。

为什么呢?因为这样做会使许多方法抛出&#34;无法跟踪实体类型X的实例,因为已经跟踪了具有相同密钥的此类型的另一个实例&#34; ,因为EF使用引用相等来跟踪实体实例。

如果附加,添加等普通(非代理)对象实例,它们将在上下文的生命周期内保持这种方式,或直到明确分离。