![](/img/trans.png)
[英]How to get NHibernate SchemaExport to create SQL Server Timestamp columns?
[英]NHibernate read timestamp column from SQL Server
我正在使用NHibernate 4.0.0.4000(通过代码映射)和SQL Server 2012。
我必须访问其中包含timestamp
(否则也称为行版本)列的表。 到现在为止,我可以通过不在实体/映射中使用它来简单地忽略该列。
现在,我想使用它来查看自上次检查相关表以来哪些行已更改。
由于时间戳只能由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));
}
}
此版本的结果:
无法更新时间戳列
作为读取过程中的错误消息(在自动Session.Flush()
上,关闭包装数据库连接的using语句时)。
当我在映射中删除访问器时,我可以毫无问题地阅读,但是当我在表中插入新行时,我得到了消息
无法将明确的值插入时间戳列。 将INSERT与列列表一起使用可排除timestamp列,或将DEFAULT插入timestamp列。
当我改变set;
private set;
,我在初始BuildSessionFactory();
期间收到了消息BuildSessionFactory();
以下类型不能用作代理:PigTool.Entities.TblAnwendungsbelegposition:方法set_upsize_ts应该是“公共/受保护的虚拟”或“受保护的内部虚拟”
当我删除set;
从实体属性,我在初始BuildSessionFactory();
期间收到消息BuildSessionFactory();
在类“ PigTool.Entities.TblAnwendungsbelegposition”中找不到属性“ upsize_ts”的设置器
有谁知道如何在保留生成新行的能力的同时成功读取包含此只读列的行? 我不希望每个相关表都没有两个实体/映射,其中一个不包含日常工作的timestamp属性,而一个拥有它的属性仅用于读取。
我终于找到了解决方案。
在映射交换中
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);
});
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.