初めてfluentnhibernateを使用して、リモートMySqlサーバーにアクセスするための既存のデータベースアクセスレイヤーを段階的に廃止します。
クライアントはほとんど仮想化されており、任意の時点(数秒から数日)でスリープ/休止状態になります。通常はサーバーと時間同期しているため保証できませんがDateTime
、一部のフィールドで提供されているクライアントを使用できません。
サーバー時間で特定のフィールドを設定/更新するためにnhibernateを取得するにはどうすればよいですか(できればUTC_TIMESTAMP()
関数を呼び出すことによって)?
物体:
public class MyObject{
public virtual UInt64 Id { get; set; }
public virtual String Status{ get; set; }
public virtual String SomeData{ get; set; }
//Set only once when the Object is inserted
public virtual DateTime TimeCreated { get; set; }
//Set every time the object is updated
public virtual DateTime TimeLastUpdate { get; set; }
//Set every time the 'Status' column is updated
public virtual DateTime TimeStatusLastChanged { get; set; }
//This is a user provides standard datetime field
public virtual DateTime SomeUserSpecifiedTime { get; set; }
}
マッピング:
Id(x => x.Id)
.GeneratedBy.Native();
Map(x => x.Status);
Map(x => x.SomeData);
Map(x => x.SomeUserSpecifiedTime);
//? -->
Map(x => x.TimeCreated)
.Not.Update();
Map(x => x.TimeLastUpdate);
Map(x => x.TimeStatusLastChanged);
//<-- ?
Time*
3つのフィールドが設定/更新されたときに関数を使用するようにしたいUTC_TIMESTAMP()
ので、サーバー側の日付/時刻が挿入されます。DateTime SomeUserSpecifiedTime
フィールドは、標準のマップされたフィールドです。
これまで、私のデータベースアクセスクラスには、その方法でクエリを作成するためのロジックが含まれていました。マッピングを使用してデータベーストリガーを作成することはできました.Generated.Insert/Always
が、それを行うためのnhibernate/コードのみの方法があることを望んでいました。
私が見つけた解決策の1つは、サーバーから時間をフェッチして挿入/更新に提供することですが、フェッチと挿入/更新の間の時間がかなり長くなる可能性があるため、それはありません。