使用AsNoTracking检查实体是否已加载

时间:2016-08-19 01:50:10

标签: sql sql-server entity-framework entity-framework-6

有没有办法检查实体是否使用 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();
    ...
    ...
    ...
}

您怎么看?

谢谢!

1 个答案:

答案 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();
    ...
    ...
    ...
}

我希望这篇文章可以帮助有类似问题的人。

干杯!