我有一个存储库,其中包含添加和搜索方法
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这样做
答案 0 :(得分:2)
EF仅为其创建的实体实例创建代理 - 在实现查询时隐式实现,或在使用DbSet.Create
方法时显式实现。接收用户提供的对象实例的任何方法(如Add
,Remove
,Attach
,Entry
等)都不会修改(使用代理包装)传递的对象。
为什么呢?因为这样做会使许多方法抛出&#34;无法跟踪实体类型X的实例,因为已经跟踪了具有相同密钥的此类型的另一个实例&#34; ,因为EF使用引用相等来跟踪实体实例。
如果附加,添加等普通(非代理)对象实例,它们将在上下文的生命周期内保持这种方式,或直到明确分离。