【问题标题】:Entity object for newly added objects instead of dynamic proxy Entity framework新添加对象的实体对象,而不是动态代理实体框架
【发布时间】:2018-02-04 12:37:35
【问题描述】:

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

   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);
    }

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

Quick watch List for retrieved list from search method

【问题讨论】:

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


    【解决方案1】:

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

    为什么?因为这样做会使很多方法抛出“无法跟踪实体类型X的实例,因为已经在跟踪具有相同键的该类型的另一个实例”,因为EF使用了用于跟踪实体实例的引用相等

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

    【讨论】:

    • 所以我所做的包括我需要的对象并不是一种解决方法,对吧?
    • 或者我做了什么最好的做法?谢谢伊万
    • 我认为没有更好的做法,尤其是在处理从其他地方收到的断开连接的实体时。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-16
    • 2015-08-27
    • 1970-01-01
    • 2014-11-30
    • 1970-01-01
    相关资源
    最近更新 更多