NHibernate从SQL Server读取时间戳列
本文关键字:时间戳 读取 Server SQL NHibernate | 更新日期: 2023-09-27 18:08:53
我使用的是NHibernate 4.0.0.4000(通过代码映射)和SQL Server 2012。
我必须访问包含timestamp
(也称为rowversion)列的表。到目前为止,我可以通过不在我的实体/映射中使用它来简单地忽略该列。
现在我想使用它来查看,自上次检查有关表以来,哪些行发生了变化。
由于时间戳只能由SQL Server修改,任何由NHibernate生成的INSERT
/UPDATE
语句都必须忽略该列。我没有找到解决这个问题的方法。
我的实体:
public class TblAnwendungsbelegposition {
public virtual int ANWBID { get; set; }
// Other properties cut out for readability
public virtual byte[] upsize_ts { get; set; }
}
我映射:
public class TblAnwendungsbelegpositionMap : ClassMapping<TblAnwendungsbelegposition> {
public TblAnwendungsbelegpositionMap() {
Table("tbl_anwendungsbelegposition");
Schema("dbo");
Lazy(true);
Id(x => x.ANWBID, map => map.Generator(Generators.Identity));
//Other properties cut out for readability
Property(x => x.upsize_ts, map => map.Access(Accessor.ReadOnly));
}
}
此版本的结果:
不能更新时间戳列
作为读取时的错误消息(在关闭封装db连接的using语句时自动Session.Flush()
上)。
当我删除映射中的访问器时,我可以毫无问题地读取,但是当我向表中插入新行时,我得到消息
不能在时间戳列中插入显式值。对列列表使用INSERT来排除时间戳列,或者在时间戳列中插入DEFAULT。
当我将set;
更改为private set;
时,我在初始BuildSessionFactory();
期间得到消息
以下类型不能用作代理:pigtools . entities . tblanwendungsbelegposition: set_upsize_ts方法应该是"public/protected virtual"或"protected internal virtual"
当我从entity-property中删除set;
时,我在初始BuildSessionFactory();
无法在类'PigTool.Entities.TblAnwendungsbelegposition'中找到属性'upsize_ts'的setter
有没有人知道我如何能够成功地读取包含这个只读列的行,同时保留生成新行的能力?我不希望每个相关表都有两个实体/映射,其中一个不包含用于日常工作的时间戳属性,另一个包含时间戳属性,但只用于读取。
我终于找到解决办法了。
在映射中交换
Property(x => x.upsize_ts, map => map.Access(Accessor.ReadOnly));
Version(x => x.upsize_ts, map =>
{
map.Column(c =>
{
c.SqlType("timestamp");
c.NotNullable(false);
});
map.Type(new BinaryBlobType());
map.Generated(VersionGeneration.Always);
map.UnsavedValue(null);
});