几天来,我一直在尝试从存储库(DbContext)中检索实体。我试图将所有的实体都保存在一个原子操作中。因此,不同的实体共同代表了对我有价值的东西。如果所有实体都是“有效的”,那么我就可以将它们全部保存到数据库中。实体'a'已经存储在我的存储库中,并且需要检索以“验证”实体'b'。这就是问题所在。我的存储库依赖于
“ChangeTracker”似乎需要额外的努力才能使其以一种可以使用Linq2Sql的方式工作,例如
对我来说,“DbSet<TEntity>.Local”有点奇怪。可能只是名称问题。我刚刚读到了一些内容,它的性能不太好(比DbSet<>本身慢)。不确定这是否是错误的陈述。
有经验的EntityFramework用户可以为此提供一些见解吗?应该遵循什么“明智”的路径?或者我是在看幽灵,应该始终使用
带有代码示例的更新:
一个出错的例子
我想展示如何使用我的
我在商业代码中以这种方式使用:
这主要是我喜欢使用类似于
如果这接近难以理解的胡说八道,请告诉我,以便我可以改进问题。我迫切需要一个答案。
非常感谢!
DbSet<TEntity>
类,它与Linq2Sql非常配合(如Include()
导航属性等)。但是,DbSet<TEntity>
不包含处于“已添加”状态的实体。因此,我们有两个选择:1.使用ChangeTracker
查看可用的实体并根据它们的EntityState
将它们查询到集合中;2.使用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
中检索实体,这不允许我在以后的某个时间点上惰性加载相关实体。如果这接近难以理解的胡说八道,请告诉我,以便我可以改进问题。我迫切需要一个答案。
非常感谢!
Create
方法返回新实体。 - Gert Arnold