我第一次使用 fluent nhibernate 来逐步淘汰我现有的数据库访问层以访问远程 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*
字段在设置/更新时使用该UTC_TIMESTAMP()
函数,以便插入服务器端日期/时间。该DateTime SomeUserSpecifiedTime
字段是标准映射字段。
到目前为止,我的数据库访问类包含以这种方式创建查询的逻辑。我可以使用映射创建数据库触发器.Generated.Insert/Always
,但我希望有一种 nhibernate/code-only 方式来做到这一点。
我发现的一种解决方案是从服务器获取时间并将其提供给插入/更新,但这已经过时了,因为获取和插入/更新之间的时间可能很长。