2009-12-23 35 views
3

我有一個數據庫接受沒有空值,並有一個默認的每個字段。使用流利的nHibernate,如果我有一個組件有一些(但不是所有的屬性)填充,我得到一個插入錯誤。我只是想知道如何將DynamicInsert標誌降低到組件級別。也許已經很晚了,但我會把它放在這裏,看看它發生了什麼。nhibernate動態插入失敗,有一些空的組件屬性

映射:

public ClientMap() 
    { 
     Table("Clients"); 
     DynamicInsert(); 
     DynamicUpdate(); 
     CompositeId() 
      .KeyProperty(x => x.Accountnumber, "acct_no") 
      .KeyProperty(x => x.Transferaccount, "tr_acct_no"); 

     Component(c => c.Address, 
      m =>{ 
       m.Map(x => x.Streetaddress, "coaddress").Not.Nullable().Default(""); 
       m.Map(x => x.City, "cocity").Not.Nullable().Default(""); 
       m.Map(x => x.Postalcode, "costate").Not.Nullable().Default(""); 
       m.Map(x => x.State, "cozip").Not.Nullable().Default(""); }); 
    } 

測試:

Client nw = new Client{ Address = new Address{Streetaddress = "my address"},Accountnumber = "6543219",Transferaccount = "1"}; 
    IRepository repo2 = new Repository(session); 
    repo2.Save(nw); 

錯誤:

無法插入:[BusinessObjects.Client#BusinessObjects.Client] [SQL:INSERT INTO客戶端(coaddress, VALUES(?,?,?,?,?,?)]

回答

3

我不確定,但我認爲您指定的'NotNullable'和'Default'映射屬性僅影響/僅在您使用NHibernate映射創建數據庫模式時使用,而且它們對NHibernate將插入到數據庫中的內容沒有實際影響。

如果你想要一個屬性的默認值,我認爲你應該給該屬性默認值在具有此屬性的類的構造函數中。

0

NHibernate本身不支持組件映射上的動態插入 - 它在Fluent中並不缺少。

建議您在Address上設置一個默認構造函數,將這些默認屬性值設置爲空字符串而不是空值?

+0

在構造函數中設置默認屬性,然後允許我繞插入錯誤。接下來的問題將是更新策略,當某些事情沒有改變時。如果一個屬性發生變化,整個組件都會得到更新,必須有一個標準的方法來解決這個問題,因爲並不是所有對象的消費者都需要所有的數據。 – 2009-12-23 18:02:47

0

NHibernate認爲一個組件是單個井組件:-) 這意味着它不會爲組件做動態插入。

1

剛碰到類似的問題。 數據庫具有默認約束:

CREATE TABLE MyTable 
(
... 
    InsertDate datetime not null default getdate() 
... 
) 

對象屬性:

public DateTime? InsertDate{get;set;} 

在映射我是這樣做的:

Map(x => x.InsertDate).Column("InsertDate").Not.Nullable().Default("getdate()"); 

但我把它改爲:

Map(x => x.InsertDate).Column("InsertDate").Generated.Insert(); 

哪個不會如果屬性爲null,則插入該屬性