1

(ほぼ) すべてのテーブルの作成および変更されたフィールドを含む MSSQL データベースによってサポートされている Web API プロジェクトがあります。これらのフィールドにはトリガーがあり、レコードの挿入時と更新時に両方がそれぞれ更新されます。

リクエストが成功した後、データを JSON にシリアル化するときに、リクエストを行うフロントエンドがそれを処理できるように、これらの作成および変更されたフィールドを送信したいと考えています。ただし、私が望んでいないのは、データが逆シリアル化される (またはポストバックされる) ときにこれらのフィールドが変更される可能性があることです。非常に単純で、フィールドで [JsonIgnore] 属性を使用するだけです。ゲットではなくセットだけに置いてください。

ここで、物事が私にとって混乱し始めます。私のプロジェクトのすべてのモデルは、エンティティ モデル (.edmx) から自動的に生成されます。そのため、モデル自体を直接編集することはできませんが、その上に部分モデルを生成する必要があります。これに対する解決策は、[MetadataType] 属性を使用して他の SO スレッドで見たことがあります

しかし、これを(効率的に)私のケースに適用するにはどうすればよいですか?私は周りを検索してきましたが、「より高い」部分クラスで自動実装されたプロパティを引き離す方法の例は見つかりませんでした。それでも、これは、すべてのモデルに対して部分クラスを作成する必要があることを意味し、これは非常に面倒です。これまで誰もこれをやったことがないとは思えないので、これを追求するもっとエレガントな方法はないでしょうか?

クラスの例は次のとおりです。

public partial class Person
{
    [DataMember]
    public Nullable<System.DateTime> Created { get; set; }
    [DataMember]
    public Nullable<System.DateTime> Modified { get; set; }
}
4

1 に答える 1

1

最終的に、モデル ファーストのアプローチからコード ファーストのアプローチに切り替えて、モデルをより細かく制御できるようにしました。

でも、いろいろ調べた結果、自分の質問に答えるようになりました。この質問の核心は、Created フィールドと Modified フィールドを自動的に設定し、フロントエンドの逆シリアル化を無視しながら、それらのフィールドをシリアル化によってフロントエンドに送信できるようにしたいということでした。

SaveChanges解決策は、クラス内のメソッドをオーバーライドすることにありますDbContext。この優れた例は、この SO スレッドに示されています: Entity Framework 4.1 DbContext Override SaveChanges to Audit Property Change。だから、ジェームズ・ポグランが私の頭の中にアイデアを呼び起こし、そのようにして問題を解決してくれたことに感謝します。

彼がしているのは、 がどのようにDbEntity変更されたかをチェックすることです。彼は、エントリが追加されているか変更されているかに応じて Created フィールドと Modified フィールドを設定し、その後、base.SaveChanges通常の操作を続行するために呼び出します。

于 2013-07-16T13:58:30.377 に答える