アプリケーションの DAL 層と BL 層を実装しています。WCF サービスとしてホストされ、EF 4 が ORM として使用されます。ロールベースのセキュリティレイヤーと、特定のロールによってオブジェクトの一部のみを更新できるビジネスルールがあります。
問題の簡単な例を次に示します。
このような DTO があります。
MainType
{
public Guid ID { get; set; }
public String DoctorField1 { get; set; }
public String DoctorField2 { get; set; }
public String NurseField1 { get; set; }
public String NurseField2 { get; set; }
public DateTime Created {get; set;}
public DateTime Updated {get; set;}
public Guid LastUpdateBy {get; set;}
public List<DetailsType> Details { get; set; }
}
DetailsType
{
public Guid MainTypeID { get; set; }
public Guid SomeIdentityID { get; set; }
public String DoctorDetail { get; set; }
public String NurseDetail { get; set; }
public DateTime Created {get; set;}
public DateTime Updated {get; set;}
public Guid LastUpdateBy {get; set;}
}
このエンティティは、同じフィールドを持つ対応する DB テーブルにマップされます。
- MainType の ID フィールドは主キーです。
- DetailsType の MainTypeID は MainType テーブルへの外部キーです。
- DetailsType の SomeIdentityID は、このサンプルにとって重要ではない他のエンティティへの FK です。
- MainTypeID SomeIdentityID は、DetailsType テーブルの複雑な主キーです。
このようなオブジェクト (1 つのメインとリストの詳細) のグラフがあり、更新操作を実行するユーザーの役割を決定しました。私の仕事は:
- 現在のユーザーが医師の役割を持っている場合 - メイン オブジェクトとすべての詳細オブジェクトの医師フィールドを更新し、新しい詳細オブジェクトを挿入します。
- 現在のユーザーに看護師の役割がある場合 - メイン オブジェクトとすべての詳細オブジェクトの看護師フィールドを更新します。
- 現在の日付を更新済みフィールドに保存
- 現在のユーザー ID を LastUpdateBy フィールドに保存する
- Created フィールドや、このロールによって更新されないその他のフィールドは変更しないでください。
たとえば、ロール Doctor を持つユーザーがいる場合、次のようにする必要があります。
- MainObject の DoctorField1、DoctorField2、Updated、LastUpdateBy を更新します。
- すべての詳細オブジェクトで DoctorDetail、Updated、LastUpdateBy を更新する
- 他のフィールドは変更しないでください。
現在、MainObject の完全なグラフを読み取り、必要な変更を加えて DB に保存する実装があります。このソリューションは動作が遅すぎるため、改善する方法を見つける必要があります。現在、RAW SQLでそれを行う方法を明確に知っていますが、他に何も役に立たない場合に備えて、これが私の解決策になります。
必要なフィールドのみを更新し、別のフィールドを無視するように Entity Framework を作成するにはどうすればよいですか。
String フィールドの ApplyOriginalValues メソッドと ApplyCurrentValues メソッドで、いくつかの成功した結果が得られました。アイデアは、両方のオブジェクトのプロパティに架空の値を割り当てることでした。変更の保存中に変更されていないプロパティ。ただし、このトリックは Boolean、Int32、および Decimal 値では機能しません。すべてのオブジェクトに対して単純なアプローチを使用する必要があります。
この問題に関するアイデアや考えをいただければ幸いです。