2016-12-02 27 views
1

我有一個簡單的實體 地圖GUID柱在功能NHibernate帶約束

public class SiteEntity 
{ 
    public virtual int Id {get; set;} 
    public virtual Guid PublicId {get; set;} 
    public virtual string Name {get; set;} 
} 

我使用Fluent NHibernate包,以實現以下約束映射它:

  • Id是內部DB標識符,以便它會自動創建並定義爲PK
  • PublicId是一個公共唯一ID。它被定義爲具有獨特和NOT NULL約束的列和插入產生很像PK
  • Name是描述所以需要(不爲空),但可以是任何

至於結果,我有以下映射

public class SiteEntityMap : ClassMap<SiteEntity> 
{ 
    public SiteEntityMap() 
    { 
     Table("T_SITE"); 
     Id(x => x.Id).Column("site_id").GeneratedBy.Identity(); 
     Map(x => x.PublicId, "site_public_id").Generated.Insert().ReadOnly().Unique().Not.Nullable(); 
     Map(x => x.Name, "site_name").Not.Nullable().CustomType("AnsiString").Unique().Length(512); 
     ReadOnly(); 
    } 
} 

現在,如果我創建使用,因爲我喜歡它創建NHibernate的映射架構。然而,用以試圖節省SiteEntity與該消息已字段Name初始化在GenericADOException結果:

「無法插入:[IWS.Configuration.DataModel.SiteEntity] [SQL:INSERT INTO T_CFG_SITE(SITE_NAME)VALUES( ?);選擇SCOPE_IDENTITY()]」

如果我從PublicId財產一切正常的映射刪除Not.Nullable()但在數據庫領域允許空值。

請建議如何將Guid屬性映射到插入時自動生成值不可爲空的列。

+0

您是否在插入前檢查實體是如何被構造的? –

+0

看來site_name爲空,你檢查了嗎?你檢查是否有一些觸發器?看看這個表格:T_CFG_SITE –

+0

是的,當我調用'session.Save(siteEntity)'時,對象在Name屬性中有值。我在這個問題中寫道,雖然這個消息就是它的樣子,但實際的問題在於'PublicId'屬性的映射。請重新閱讀這個問題,讓我知道什麼是不清楚的,所以我可以重新翻譯一下。 –

回答

1

它看起來像流利的NHibernate缺乏一種方法來指定這種值的隱式生成邏輯。可以定義一個默認值,但使用特定於數據庫的功能會打破數據庫抽象。不幸的是,Generated屬性沒有公開任何注入爲Insert()操作(或Update())生成值的代碼的方法。 簡短的回答是:「沒有辦法強制隱式生成值或聲明在映射時執行它的代碼」。