エンティティタイプに基づいてリポジトリを作成したいと思います。それを行う方法はありますか?
- エンティティがたくさんあるので、これは汎用コードである必要があります。
- 所有するすべてのエンティティの履歴テーブルが必要です。
- リポジトリと作業単位のパターンを使用して、コードファーストの
DbContext
EF5.0を使用しています。
以下は、SaveChanges
メソッドの変更を取得するために必要なコードです。変更および削除されたエンティティごとに、古い行を履歴テーブルに保存します。以下は、単一のエンティティ用にハードコーディングされています ServiceLocation
。
すべてのエンティティには、対応する履歴エンティティがあります。たとえば、ServiceLocation
エンティティにはServiceLocationHistory
エンティティ(およびリポジトリ)があります。
modifyEntityがタイプの場合ServiceLocation
、どうすれば作成できますServiceLocationHistoryRepository
か?そして、それをすべてのタイプに一般的にしますか?
public override int SaveChanges()
{
// Get the entities that changed
var addedEntries = ChangeTracker.Entries().Where(e => e.State == EntityState.Added && e.Entity is IHistoryBase).Select(e => (TBaseEntity)e.Entity);
var modifiedEntries = ChangeTracker.Entries().Where(e => e.State == EntityState.Modified && e.Entity is IHistoryBase).Select(e => (TBaseEntity)e.Entity);
var deletedEntries = ChangeTracker.Entries().Where(e => e.State == EntityState.Deleted && e.Entity is IHistoryBase).Select(e => (TBaseEntity)e.Entity);
// Debugging watch varibles
int x = addedEntries.Count();
int y = modifiedEntries.Count();
int z = deletedEntries.Count();
// Create the Type adapter
TypeAdapter adapter = new TypeAdapter(new RegisterTypesMap[] { new HistoryRegisterTypesMap() });
var serviceLocationHistoryRepository = new ServiceLocationHistoryRepository(this);
foreach (var addedEntry in addedEntries)
{
addedEntry.FromDate = DateTime.Now;
addedEntry.ToDate = DateTime.Parse("9999-12-31 00:00:00.0000000");
}
foreach (var modifiedEntry in modifiedEntries)
{
ServiceLocationHistory history = adapter.Adapt<ServiceLocation, ServiceLocationHistory>(modifiedEntry as ServiceLocation);
serviceLocationHistoryRepository.Add(history);
history.FromDate = modifiedEntry.FromDate;
history.ToDate = modifiedEntry.FromDate = DateTime.Now;
modifiedEntry.ToDate = DateTime.Parse("9999-12-31 00:00:00.0000000");
}
foreach (var deletedEntry in deletedEntries)
{
ServiceLocationHistory history = adapter.Adapt<ServiceLocation, ServiceLocationHistory>(deletedEntry as ServiceLocation);
serviceLocationHistoryRepository.Add(history);
history.FromDate = deletedEntry.FromDate;
history.ToDate = DateTime.Now;
}
return base.SaveChanges();
}