次のエンティティがある場合:
public class PocoWithDates
{
public string PocoName { get; set; }
public DateTime CreatedOn { get; set; }
public DateTime LastModified { get; set; }
}
これは、同じ名前/属性を持つ SQL Server 2008 テーブルに対応しています...
どうすれば自動的にできますか:
- レコードの CreatedOn/LastModified フィールドをnowに設定します(INSERT の実行時)。
- レコードの LastModified フィールドをnowに設定します(UPDATE の実行時)。
私が自動的に言うとき、私はこれができるようになりたいという意味です:
poco.Name = "Changing the name";
repository.Save();
これではない:
poco.Name = "Changing the name";
poco.LastModified = DateTime.Now;
repository.Save();
舞台裏では、「何か」が日時フィールドを自動的に更新する必要があります。その「何か」とは?
私は Entity Framework 4.0 を使用しています - EF がそれを自動的に行う方法はありますか? (多分EDMXの特別な設定?)
SQL Server 側からはDefaultValueを使用できますが、これはINSERT (UPDATE ではなく)に対してのみ機能します。
同様に、POCO のコンストラクターを使用してデフォルト値を設定できますが、これはオブジェクトをインスタンス化する場合にのみ機能します。
もちろん、トリガーを使用することもできますが、理想的ではありません。
私はEntity Frameworkを使用しているため、SavingChangesイベントにフックしてここで日付フィールドを更新できますが、問題はPOCOを「認識する」必要があることです(現時点では、私のリポジトリはジェネリックで実装されています)。ある種の OO トリックを実行する必要があります (POCO にインターフェイスを実装させ、その上でメソッドを呼び出すなど)。私はそれに不利ではありませんが、そうしなければならない場合は、手動でフィールドを設定したいと思います。
基本的に、SQL Server 2008 または Entity Framework 4.0 ソリューションを探しています。(またはスマートな .NET の方法)
何か案は?
編集
@marc_s の回答に感謝しますが、私のシナリオにより適したソリューションを使用しました。