2016-09-26 58 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); 
     });