有没有办法检查实体是否使用 AsNoTracking()加载?
如您所知,以下代码不适用于使用 AsNoTracking()加载的实体。
ef.Entry(db).Collection(p => p.tblProducts).Load();
ef.Entry(db).Collection(p => p.tblOrders).Load();
...
...
...
因此,如果实体" db "使用 AsNoTracking()加载,然后我将执行以下操作来加载其子项。
db.tblProducts = ef.tblProducts.AsNoTracking().Where(x => x.WarehouseId == db.WarehouseId).ToList();
db.tblOrders = ef.tblOrders.AsNoTracking().Where(x => x.WarehouseId == db.WarehouseId).ToList();
...
...
...
我知道这可能不是一个好方法,但如果实体" db "使用 AsNoTracking()加载,然后我知道它的子项也不需要被跟踪。
问题是,如何确定实体(传入函数)是否使用 AsNoTracking()加载。
可能的解决方案
我在这里找到了这篇帖子EntityFramework Code First - Check if Entity is attached,有人发布了这样的答案
public bool Exists<T>(T entity) where T : class
{
return this.Set<T>().Local.Any(e => e == entity);
}
那么,我可以使用
if (Exists(db))
{
ef.Entry(db).Collection(p => p.tblProducts).Load();
ef.Entry(db).Collection(p => p.tblOrders).Load();
...
...
...
}
else
{
db.tblProducts = ef.tblProducts.AsNoTracking().Where(x => x.WarehouseId == db.WarehouseId).ToList();
db.tblOrders = ef.tblOrders.AsNoTracking().Where(x => x.WarehouseId == db.WarehouseId).ToList();
...
...
...
}
您怎么看?
谢谢!
答案 0 :(得分:2)
感谢这篇帖子EntityFramework Code First - Check if Entity is attached,我创建了一个DbContext扩展(如链接所示)。
public static bool Exists<TEntity>(this DbContext ctx, TEntity entity)
where TEntity : class
{
return ctx.Set<TEntity>().Local.Any(e => e == entity);
}
它运作得很好!
if (ef.Exists(db))
{
ef.Entry(db).Collection(p => p.tblProducts).Load();
ef.Entry(db).Collection(p => p.tblOrders).Load();
...
...
...
}
else
{
db.tblProducts = ef.tblProducts.AsNoTracking().Where(x => x.WarehouseId == db.WarehouseId).ToList();
db.tblOrders = ef.tblOrders.AsNoTracking().Where(x => x.WarehouseId == db.WarehouseId).ToList();
...
...
...
}
我希望这篇文章可以帮助有类似问题的人。
干杯!