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

Entity framework 新添加对象的实体对象,而不是动态代理实体框架,entity-framework,entity-framework-6,ef-code-first,lazy-loading,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&

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

   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);
    }
公共虚拟作废添加(T obj)
{
_表.附件(obj);
_表2.添加(obj);
}
公共虚拟IEnumerable搜索(表达式谓词)
{
返回_db.Set(),其中(谓词);
}
然后在我的控制器上,在我使用add方法添加新的customer note对象并保存更改后,我使用search根据customer Id检索备注,我得到一个列表,如下图所示,新添加的对象类型为poco class,并且未加载所有虚拟导航属性,我使用include进行了变通,有没有解释为什么英孚会这样做


EF仅为其创建的实体实例创建代理—在具体化查询时隐式创建代理,或在使用
DbSet.create
方法时显式创建代理。任何接收用户提供的对象实例的方法(如
添加
删除
附加
条目
等)都不会修改(用代理包裹)传递的对象

为什么??因为这样做会使许多方法抛出“无法跟踪实体类型X的实例,因为具有相同密钥的该类型的另一个实例已被跟踪”,因为EF使用引用相等性跟踪实体实例


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

所以我所做的包含我需要的对象的工作不是一个解决方法,对吗?或者我所做的工作有一个最佳实践?感谢IvanI,我认为没有更好的实践,尤其是在处理从其他地方收到的断开连接的实体时。