DbFirstモデルでEFを使用するプロジェクトがあります。エンティティの一部のプロパティは、プロジェクトのニーズに合わせて調整する必要があります。これは、.edmxDesignerファイルを手動で編集することで行いました。これらの調整は、マイナーなストリング操作です。問題は次のとおりです。データベースからモデルが更新されるたびに、これらの変更は上書きされます。これを行う別の方法はありますか?
4 に答える
実際には、データベースから変更を行ってこれらの変更が停滞したままになることを除いて、そうでない場合はモデルの更新時にイベントを作成して、モデルが更新されるたびに設定が強化されるようにします。
データベースからモデルを更新すると、モデルが更新されます。エンティティを定義し、これをカスタマイズできる個別のクラスを作成する必要があります。
他の2つの答えは、必要なもののほとんどをカバーしています。
エンティティモデルはすべて部分クラスとして構築されます。データベースに対して何かを行うたびに、クラス定義を変更します。そのため、これらすべてに、このコードを変更しないでくださいというヘッダーがあります。
データが含まれているデータプロジェクトがあると仮定して、同じプロジェクトに新しいクラスを作成します。したがって、モデルが
partial class Customer:EntityObject
次に、次のように定義されるCustomerOverloadクラスライブラリを作成します。
partial class Customer
そして、そのクラスには追加などが含まれます。メソッドを追加しないでください。メソッドはクライアントに引き継がれません。
やりたいことに応じて、EFには多くの「フック」が用意されているため、デザイナーではなくカスタムコードを追加できます。すべてのクラスは部分的であるため、部分的なクラスを作成してから、セッターを変更する場合はOnYourPropertyNameChangingにフックできます。
私のコードのいくつかからの抜粋:
[EdmScalarPropertyAttribute(EntityKeyProperty=false, IsNullable=true)]
[DataMemberAttribute()]
public global::System.String EmployeeComment
{
get
{
return _EmployeeComment;
}
set
{
OnEmployeeCommentChanging(value);
ReportPropertyChanging("EmployeeComment");
_EmployeeComment = StructuralObject.SetValidValue(value, true);
ReportPropertyChanged("EmployeeComment");
OnEmployeeCommentChanged();
}
}
private global::System.String _EmployeeComment;
partial void OnEmployeeCommentChanging(global::System.String value);
partial void OnEmployeeCommentChanged();
したがって、Changingメソッドでカスタムロジックを実行する場合は、部分クラスを宣言し、コードを次のように配置できます。
public partial class Comment
{
partial OnEmployeeCommentChanging(string value)
{
/* your code goes here */
}
}