如何从 DbContext 中检索未提交的实体?
考虑以下测试:
[Test]
public void AddAndRetrieveUncommittedTenant()
{
_tenantRepository.Create("testtenant");
var tenant = _tenantRepository.GetTenantByName("testtenant");
Assert.AreEqual("testtenant", tenant.Name);
}
测试失败因为tenant
是null
.
中间有很多具体的业务代码,归结起来就是:
在我的 Repository
类方法 GetTenantByName
最后调用GetAll
方法。
public IQueryable<TEntity> GetAll()
{
return DbSet.AsQueryable();
}
private IDbSet<TEntity> DbSet
{
get { return Context.Set<TEntity>(); }
}
以及扩展 DbContext
的类我有以下方法:
public new IDbSet<TEntity> Set<TEntity>() where TEntity : class
{
return base.Set<TEntity>();
}
当我在 return base.Set<TEntity>();
上放置断点时我可以看到该实体在存储库中可用(通过 local
属性)。
如何从我的存储库中检索未提交的实体?
最佳答案
我使用派生自 DbContext
的类并添加以下方法来访问已更改的实体。这还应该告诉您如何访问 DbContext
中更改的实体:
public virtual IEnumerable<DbEntityEntry> ChangedEntities
{
get { return base.ChangeTracker.Entries().Where(e => e.State != EntityState.Unchanged); }
}
ChangeTracker
是 DbContext
上的公共(public)属性,因此您也可以从外部类访问此属性:
var dirtyEntities = myDbContext.ChangeTracker.Entries().Where(e => e.State != EntityState.Unchanged);
或者,如果您想查找已添加/修改的实体等,您可以获得更具体的信息:
var addedEntities = myDbContext.ChangeTracker.Entries().Where(e => e.State == EntityState.Added);
var modifiedEntities = myDbContext.ChangeTracker.Entries().Where(e => e.State == EntityState.Modified);
等等。
关于c# - 从 DbContext 中检索未提交的实体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15073380/