0

ここでのSOの説明に続いて、コンストラクターのCreatedおよびModifiedデータベースフィールドのデフォルトの日時値を作成するために、部分的なクラスを実装しました。

ここで問題となるのは、データベースに100以上のテーブルがあり、そのうち75以上が、作成済み列と変更済み列の定義を含む同じ基本構造を持っていることです。

したがって、維持する必要のある75以上の部分クラスを作成する代わりに、すべてのEFタイプが継承する基本クラスを作成する方法はありますか?デフォルトのコンストラクターを継承して、CreatedおよびModifiedのDateTime値を設定しますか?

編集:注目に値するのは、私がEF4.0を使用していることです

4

2 に答える 2

1

確かに、エンティティの基本クラスを使用するように EF に指示できます (デザイナーではエンティティのプロパティとして適切です)。ただし、このフィールドの既定値を確認したい場合は、おそらくObjectContext SavingChanges と ObjectMaterialized の 2 つのイベント。

http://msdn.microsoft.com/en-us/library/system.data.objects.objectcontext. Savingchanges.aspx

http://msdn.microsoft.com/en-us/library/system.data.objects.objectcontext.objectmaterialized.aspx

これらの機会を利用して、使用するデフォルト値を挿入できます。したがって、たとえば、SavingChanges ハンドラーでは、コンテキストで ObjectStateManager をチェックして、関連するエンティティの状態が EntityState.Added であるかどうかを確認し、必要に応じて Created および Modified 日付を設定できます。

または、提案されているように、SQL Server の列の既定値を GetDate() にすることができない理由はありますか? (SQL Serverを使用していると仮定します)....

于 2010-11-05T04:26:21.360 に答える
1

EF4 のほうがはるかに簡単ですが、EF4 と EF1 の両方で独自の基底クラスを指定できます。デザイン サーフェイスを右クリックすると、コード生成項目を追加するオプションが表示されます。ADO.Net エンティティ オブジェクト ジェネレーターを選択します。これは、モデルからエンティティ クラスを生成するために使用するテンプレートを指定するプロジェクトの T4 ファイル (.tt 拡張子) になります。別の基本クラスを指定するには、その中の次のような行を探します。

Private Function BaseTypeName(ByVal entity As EntityType, ByVal code As CodeGenerationTools) As String
    Return If(entity.BaseType Is Nothing, "EntityObject", MultiSchemaEscape(DirectCast(entity.BaseType, StructuralType), code))
End Function

EntityObject を基本クラスに置き換えます。このテンプレートを使用している場合、基本クラスは System.Data.Objects.DataClasses.EntityObject から継承する必要があることに注意してください。代わりに POCO テンプレートを使用できますが、おそらくこれで十分です。

于 2010-11-05T09:38:41.843 に答える