0


1

EF部分クラスとデフォルト値

SO dicsussion hereに続いて、部分クラスを実装しました。コンストラクタで作成および変更されたデータベースフィールドのデフォルトの日時値を作成します。

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

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

編集:注目に値するのは、EF 4.0を使用していることです

2 Answer


1


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

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

または、提案されているように、SQL Serverの列のデフォルト値がGetDate()だけではない理由がありますか? (SQL Serverを使用していると仮定)…​


1


EF4とEF1の両方を使用して独自の基本クラスを確実に指定できますが、EF4の方がはるかに簡単です。 デザイン画面を右クリックすると、コード生成アイテムを追加するオプションが表示されます。 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テンプレートを使用できますが、おそらくこれで十分です。