2011-02-03 15 views
1

Hey、 私はすべてのレコードをスタンダードスタンプにしたいと言うことができます。EF CTP5 POCO、基底クラス、および継承の実装方法

inserted_by, inserted_at, updated_by, updated_at, deleted_by, deleted_at, timestamp 

1 - 私はベースに(多分抽象)POCOクラスをこれを入れていた場合は、これを実装するための最良の継承戦略がどうなりますか。 (私は主キーとしてGUIDを使用しています)

私は何か他の目的でベースクラスを使いたくありません。 私のDbの文脈で; 私はdbテーブルに対応する終了POCOクラスを使用したいと思います。 DbSet、私はDbSetタフを使用するように見えますが、次にOfTypeを使用してクエリを実行します:)

2 - 継承がコンテキスト外である場合、ComplexType、Interfaceはおそらくお勧めしますか?

答えて

1

私はEF4とまったく同じです。

public class GenericRepository<T> : IGenericRepository<T> where T : BaseEntity 

すべてのエンティティリポジトリはこのクラスから継承します。ジェネリック.Add()と、自動的に監査データを設定.Update()メソッド:

public void Add(T entity) 
{ 
     entity.CreatedOn = DateTime.UtcNow; 
     entity.CreatedBy = UserName; 
     entity.LastModifiedOn = entity.CreatedOn; 
     entity.LastModifiedBy = entity.CreatedBy; 
     ObjectContext.AddObject(GetEntitySetName<T>(), entity); 
} 

public void Update(T entity) 
{ 
     T originalEntity = ObjectSet.Single(t => t.Id == entity.Id);    
     entity.CreatedOn = originalEntity.CreatedOn; 
     entity.CreatedBy = originalEntity.CreatedBy; 
     entity.LastModifiedOn = DateTime.UtcNow; 
     entity.LastModifiedBy = UserName; 
     ObjectSet.ApplyCurrentValues(entity); 
} 

だから、あなたはそれがPOCOの責任ではないので、それは、POCOベースクラスBaseEntityに入るdoesntのことがわかります。代わりに、リポジトリに属します。

+0

あなたはどうしていますか(私はあなたがPOCOを使用しているとは思わない) – hazimdikenli

+0

+1私はこれに同意します。タイムスタンプを更新することはデータベース上の問題であり、このロジックをPOCOに置くとPOCOではなくなります。タイムスタンプを持つことは、EFで継承を実装するための実現可能な理由ではありません。 – RPM1984

+0

@RPM:私は同意しません - タイムスタンプを使用する場合は、エンティティにマップし、ConcurrencyCheckAttribute(コードファースト)または固定同時実行モード(純粋なEF4)として設定する必要があります。エンティティにタイムスタンプをマップしない場合は、まったく使用しないのと同じです。 –

0

TPC継承(クラスあたりのテーブルまたはコンクリートタイプごとのテーブル)が必要です。 TPCのCTP5マッピングについては、this articleを確認してください。

+0

TPCを使用している場合、私のDbSetの構成は何ですか?具体的な型または基底型をベースにできますか? – hazimdikenli

+0

@hazimdikenli:任意の継承を使用する場合、セットはDbSet ですが、セット内のエンティティは派生型です。 OfTypeを使用して派生型のみを照会することができます。 –

+0

それは私に必要なものを私に提供するつもりはありません。 – hazimdikenli

関連する問題