ここ数日、リポジトリからエンティティを取得するのに苦労しています(DbContext
)。
アトミックアクションですべてのエンティティを保存しようとしています。したがって、さまざまなエンティティが一緒になって、私にとって価値のあるものを表しています。すべてのエンティティが「有効」である場合、それらすべてをデータベースに保存できます。エンティティ'a'はすでにリポジトリに保存されており、'エンティティ'b'を検証するために取得する必要があります。
ここで問題が発生します。DbSet<TEntity>
私のリポジトリは、Linq2Sql(Include()
ナビゲーションプロパティなど)でうまく機能するクラスに依存しています。ただし、にDbSet<TEntity>
は「追加」状態のエンティティは含まれていません。
したがって、(私が知る限り)2つのオプションがあります。
- を使用して、使用
ChangeTracker
可能なエンティティを確認し、それらに基づいてセットにクエリを実行しますEntityState
。 - プロパティを使用し
DbSet<TEntity>.Local
ます。
Linq2Sqlを使用してプロパティをナビゲーションChangeTracker
できるような方法で動作させるには、余分な作業が必要になるようです。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
ナビゲーションプロパティに柔軟性が必要です。Iを使用するChangeTracker
と、でエンティティを取得しますList
。これにより、後で関連するエンティティを遅延ロードすることができなくなります。
これが理解できない強気*tに近い場合は、質問を改善できるようにお知らせください。どうしても答えが必要です。
事前にたくさんThx!