0

エンティティタイプに基づいてリポジトリを作成したいと思います。それを行う方法はありますか?

  • エンティティがたくさんあるので、これは汎用コードである必要があります。
  • 所有するすべてのエンティティの履歴テーブルが必要です。
  • リポジトリと作業単位のパターンを使用して、コードファーストのDbContextEF5.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();

    }
4

1 に答える 1

0

以下は、タイプに基づいてリポジトリを取得するために使用した概念実証コードです。

       private dynamic GetHistoryRepository(TBaseEntity entry)
    {
        // TODO - How well does the below perform?
        // TODO - Is there a way that we can only get one repository if there are multiple changed entities of the same type?
        // TODO - How can we not hard code the type name?   Put a property on each entity that gives us the entitys history repository?  Factory?

        // Get the History repository for the entity
        Type objType = Type.GetType("Data.MainBoundedContext.CALMModule.Repositories." + entry.GetType().Name.Split('_')[0] + "HistoryRepository");
        return  Activator.CreateInstance(objType, new object[] { this });
    }
于 2012-12-19T00:04:52.753 に答える