私は現在、SaveChanges
メソッドをオーバーライドしてリフレクションを利用することで、アプリ内のすべてのテーブルで履歴トラッキングを一般的な方法で実装しようとしています。簡単な場合として、のは、私は私のドメインオブジェクトと、次のようなそれぞれの履歴テーブルのための2クラス/ dbsetsを持っているとしましょう:SaveChangesでヒストリトラッキングを実装する
DbSet<Cat> Cats { get; set; }
DbSet<CatHistory> CatHistories { get; set; }
DbSet<Dog> Dogs { get; set; }
DbSet<DogHistory> DogHistories { get; set; }
CatHistory
クラスには、次の(DogHistory
は同じスキームを次の)ように見えます
public class CatHistory : HistoricalEntity
{
public int CatId { get; set; }
public virtual Cat Cat{ get; set; }
}
マイゴールは、オブジェクトが保存されているときに、適切な履歴テーブルにレコードを挿入したいとします。反射を使用しているときに型の違いを克服するのに問題があります。私の現在の試みは、以下であると私は//TODO:
ライン上で立ち往生しているように見える:あなたの歴史的実体をマッピングするためにAutoMapperを使用することができ
var properties = entry.CurrentValues.PropertyNames.Where(x => entry.Property(x).IsModified).ToList();
//get the history entry type from our calculated typeName
var historyType = Assembly.GetExecutingAssembly().GetTypes().FirstOrDefault(x => x.Name == historyTypeName);
if(historyType != null)
{
//modified entries
if (dbSet != null && historyDbSet != null && entry.State == EntityState.Modified)
{
var existingEntry = dbSet.Find(entry.Property("Id").CurrentValue);
//create history record and add entry to table
var newHistories = GetHistoricalEntities(existingEntry, type, entry);
var listType = typeof(List<>).MakeGenericType(new[] { historyType });
var typedHistories = (IList)Activator.CreateInstance(listType);
//TODO: turn newHistories (type = List<HistoricalEntity>) into specific list type (List<MyObjectHistory>) so I can addrange on appropriate DbSet (MDbSet<MyObjectHistory>)
historyDbSet.AddRange(newHistories);
}
}
エンティティから歴史的なエンティティにマッピングする場合は、[Automapper](http://automapper.org/)を試してください。 – CalC
私は歴史的なエンティティのリストを持っていて、可変型にマップしようとしています。私はautomapperにかなり精通していて、これを行う方法を見たhavent – GregH