MVC n 層アプリケーション用の Entity Framework (EF) を使い始めました。これが Web アプリケーション (ステートレス) であることは明らかであるように思われますが、分離オブジェクト モデルを使用する必要があります。追加操作を行うことにあいまいさはありません。ただし、編集を行う場合は、2 つの方法があります。
- 元のオブジェクトをコンテキストで取得し、更新されたオブジェクトをアタッチしてからデータベースに保存します。この質問への回答で述べたようなもの EF4 Context.ApplyCurrentValues は現在の値を更新しません
- この記事http://msdn.microsoft.com/en-us/data/jj592677.aspxで説明されているように、オブジェクトの個々のフィールドの IsModified プロパティを使用して、個々の変更されたプロパティを明示的に設定します 。
方法 1 には、更新の実行が必要になるたびにオブジェクトをデータベースからメモリにロードする必要があるという欠点があります。方法 2 では、オブジェクトが更新される場所から IsModified として設定するフィールドを手動で true に渡す必要があります。たとえば、オブジェクトごとに、オブジェクトのフィールドごとにブール コレクション オブジェクトを作成する必要がある場合があります。例えば
SaveEntity(EntityClass e, EntityStateClass ec)
{
context.Entry(e).Property("Name").IsModified = ec.NameState;
context.SaveChanges();
}
class EntityStateClass{ public bool NameState;}
私は単純にパフォーマンスのために方法 2 を好みますが、使用している n 層アーキテクチャとリポジトリ パターンによって妨げられています。My Repository インターフェイスは、任意のオブジェクトの保存方法を制限します。
SaveEntity(EntityClass e);
したがって、「状態」オブジェクトを渡すことはできません。コンテキスト クラスは利用できず、DAL の外部では利用できません。したがって、プロパティを外部に設定することはできません。これを達成するための「適切な」方法はありますか?
注: HTML を軽量に保つことを意図しているため、状態を持つエンティティをクライアント (ブラウザー) に送信できないため、自己追跡エンティティも問題外です。
編集:多くのことを考えた後、次のメカニズムを使用して、ドメインクラスの各フィールドの変更された状態を追跡しようとしています
- エンティティ クラスの部分クラスを宣言します。
- 更新可能なフィールドごとに、"IsModified_ FieldName "のようなブール プロパティを宣言します。
- フィールドが設定されている場合は、「IsModified_ FieldName」プロパティを設定します。
ただし、これには、Entity Framework が自動生成する暗黙的なプロパティではなく、明示的なプロパティを生成する必要があります。EF はこれを行うためのハンドルを提供しますか?
ここに私が達成しようとしているもののサンプルコードがあります
//Save Method for class EntityClass.
SaveEntity(EntityClass e)
{
context.Entry(e).Property("Name").IsModified = e.IsModified_Name;
context.SaveChanges();
}
//EntityClass is class autogenerated by EF
public partial class EntityClass
{
//This is auto-generated property by EF
public string Name {get; set;}
/* This is what I would like EF to do
private string name;
public string Name
{
get {return Name;}
set {
name = value;
//this is what I would like to do
this.IsModified_Name = true;
};
}
*/
}
//This is another partial definition for EntityClass that I will provide
public partial class EntityClass
{
//This property will be set to true if "Name" is set
public bool IsModified_Name {get; set;}
}
PS: 私が提供した情報が不十分なようで、回答がありません。
- DbContext (データベースファーストモデル) を使用しています
- EF はクラス ファイルを自動生成します。したがって、データベースを更新するたびに、クラス ファイルが再生成されます。