几天来,我一直在努力从存储库 ( DbContext
) 中检索我的实体。
我正在尝试将所有实体保存在原子操作中。因此,不同的实体一起代表了对我有价值的东西。如果所有实体都是“有效的”,那么我可以将它们全部保存到数据库中。实体“a”已存储在我的存储库中,需要检索以“验证”实体“b”。
这就是问题出现的地方。我的存储库依赖于DbSet<TEntity>
与 Linq2Sql 配合使用的类(Include()
例如导航属性)。但是,DbSet<TEntity>
不包含处于“添加”状态的实体。
所以我有(据我所知)两种选择:
- 使用
ChangeTracker
来查看哪些实体可用,并根据它们将它们查询到一个集合中EntityState
。 - 使用该
DbSet<TEntity>.Local
物业。
这ChangeTracker
似乎需要一些额外的努力才能让它以某种方式工作,以便我可以使用 Linq2Sql 来Include()
导航属性,例如
这DbSet<TEntity>.Local
对我来说似乎有点奇怪。可能只是名字。我刚读到一些它表现不佳的东西(比 DbSet<> 本身慢)。不确定这是否是虚假陈述。
具有重要 EntityFramework 经验的人可以对此有所了解吗?要遵循的“明智”之路是什么?还是我看到鬼了,我应该一直使用该.Local
物业吗?
更新代码示例:
出错的一个例子
public void AddAndRetrieveUncommittedTenant()
{
_tenantRepository = new TenantRepository(new TenantApplicationTestContext());
const string tenantName = "testtenant";
// Create the tenant, but not call `SaveChanges` yet until all entities are validated
_tenantRepository.Create(tenantName);
//
// Some other code
//
var tenant = _tenantRepository.GetTenants().FirstOrDefault(entity => entity.Name.Equals(tenantName));
// The tenant will be null, because I did not call save changes yet,
// and the implementation of the Repository uses a DbSet<TEntity>
// instead of the DbSet<TEntity>.Local.
Assert.IsNotNull(tenant);
// Can I safely use DbSet<TEntity>.Local ? Or should I play
// around with DbContext.ChangeTracker instead?
}
我想如何使用我的示例Repository
在我的Repository
我有这个方法:
public IQueryable<TEntity> GetAll()
{
return Context.Set<TEntity>().AsQueryable();
}
我以这种方式在业务代码中使用它:
public List<Case> GetCasesForUser(User user)
{
return _repository.GetAll().
Where(@case => @case.Owner.EmailAddress.Equals(user.EmailAddress)).
Include(@case => @case.Type).
Include(@case => @case.Owner).
ToList();
}
这主要是我喜欢坚持DbSet
喜欢变量的原因。我需要Include
导航属性的灵活性。如果我使用ChangeTracker
我检索 a 中的实体List
,这不允许我在以后的时间点延迟加载相关实体。
如果这接近于难以理解的废话*t,请告诉我,以便我改进问题。我迫切需要一个答案。
提前很多!