2016-09-26 53 views
0

我使用NHibernate 4.0.0.4000(与代码映射)和SQL Server 2012NHibernate的读取从SQL Server时间戳列

我不得不进入表内,以(其中包括)含有timestamp(否则也已知作为rowversion)列。到现在为止,我可以通过在实体/映射中不使用它来简单地忽略该列。

现在我想使用它来查看自上次检查问题表以来哪些行发生了更改。

由于时间戳只能由SQL Server更改,NHibernate生成的任何语句都必须忽略此列。我没有找到解决这个问题的方法。

我的实体:

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

结果此版本:

作为e无法更新时间戳列

期间读取(在自动Session.Flush()上关闭使用语句环绕数据库连接)的错误消息。

当我删除的映射我没有问题可以读取访问,但是当我插入一个新行到表中,我得到的消息

无法插入显式值时间戳列。对列列表使用INSERT来排除时间戳列,或者将DEFAULT插入到时间戳列中。 PigTool.Entities.TblAnwendungsbelegposition:方法set_upsize_ts应该是'

当我改变到private set;,我在初始BuildSessionFactory();

以下类型可能不被用作代理获得消息公共/受保护的虚拟'或'受保护的内部虚拟'

当我从实体属性中删除时,我在i nitial BuildSessionFactory();

找不到属性的设置“upsize_ts”类“PigTool.Entities.TblAnwendungsbelegposition”

有没有人有一个想法,我怎么能顺利读取包含这个只读列行,而保留生成新行的能力?我不希望每个相关表都有两个实体/映射,其中一个不包含日常工作的timestamp属性,另一个包含它,但只用于阅读。

回答

0

我终于找到了解决方案。

在映射交换

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