现在过了几天,我一直在努力从一个存储库(检索我的实体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
我检索一个实体List
,这并不让我懒加载相关实体在稍后的时间点。
如果这是接近难以理解的瞎扯淡,那么请让我知道,这样我可以改善这个问题。 我迫切需要一个答案。
THX很多提前!