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

有没有人知道我如何能够成功地读取包含这个只读列的行,同时保留生成新行的能力?我不希望每个相关表都有两个实体/映射,其中一个不包含用于日常工作的时间戳属性,另一个包含时间戳属性,但只用于读取。

NHibernate从SQL Server读取时间戳列

我终于找到解决办法了。

在映射中交换

        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);
        });