2011-11-16 53 views
0

我在WCF中使用NHibernate 3.1.0.4000和AutoMapper 2.0.0.0。我有一個我想從「多」端保持的親子關係。如果我從「一個」端做到這一點,那麼維護這些對象就沒有問題,但在這種情況下,這是毫無意義的。我的問題是,無論我如何更改我的映射,POCO等父對象,當我嘗試添加一個孩子爲null導致插入失敗的子。我錯過了什麼讓父項屬性在子中填充? 我在下面的表中定義的父子關係:nhibernate多對一父母插入時始終爲空

Create Table Attribute (AttributeUID uniqueidentifier, LongName varchar(20)) 
    Create Table AnswerOption (AnswerOptionID int, AttributeUID uniqueidentifier) 

我想要的屬性(父)是主人,所以我聲明在映射文件的關係,而不是在AnswerOption(孩子)。儘管如此,我也嘗試了雙向關係,並且沒有改變我測試中的任何行爲。我的映射apear如下。屬性:

<class name="RCAttribute" table="rcs.tblAttribute"> 
    <cache usage="read-write"/> 
     <id name="ID"> 
     <column name="AttributeUID" /> 
     <generator class="guid" /> 
     </id> 
     <property name="LongName" type="string" not-null="true" length="200" column="LongName" /> 
     <bag name="AnswerOptions" lazy="true" inverse="true" cascade="all"> 
     <key column="AttributeUID"/> 
     <one-to-many class="AnswerOption" /> 
     </bag> 
    </class> 

AnswerOption:

<class name="AnswerOption" table="rcs.tblAnswerOption" lazy="true"> 
     <cache usage="read-write"/> 
     <id name="ID"> 
     <column name="AnswerOptionID" /> 
     <generator class="native" /> 
     </id> 
    </class> 

屬性類:

[Serializable] 
    public class RCAttribute 
    { 
     public virtual Guid ID { get; set; } 
     public virtual string LongName { get; set; } 
     public virtual ICollection<AnswerOption> AnswerOptions { get; set; } 

     public RCAttribute() { ID = new Guid("00000000-0000-0000-0000-000000000000"); } 
    } 

AnswerOption類:

[Serializable] 
    public class AnswerOption 
    { 
     public virtual int ID { get; set; } 

     public AnswerOption() { ID = 0; } 
    } 

我的測試程序是這樣的;

public void CreateAnswerOption() 
    { 
     AnswerOption newOpt = new AnswerOption(); 
     Attribute.AnswerOptions.Add(newOpt); 
     Attribute = rc.RCAttributeSave(Attribute); 
    } 

當它關係到創建這個AnswerOption的屬性屬性爲空,因此它不能插入,因爲父母不能在這種情況下,孩子空。我錯過了什麼讓它填充孩子的父物業,並能夠插入?

回答

3

將集合映射爲反轉而不映射另一側的多對一是沒有意義的。

你有三個選擇:

  1. 上收集側使用帶inverse="true"一個雙向映射,並設置多對一個在你的代碼屬性格式(父參考)搶救孩子(是的,我看了前你不想這樣做)。
  2. 只映射採集端(不是反轉)。然後,NHibernate將首先插入帶有NULL的子作爲父引用,但會在同一個事務中用正確的父ID進行更新。所以你不能在子表中的父ID號列上有一個非null約束(至少它必須是可延遲的)。
  3. (此選項僅適用於NHibernate 3.2.0或更新版本)與選項2相同,但將not-null="true"添加到集合映射中的key標記。然後NHibernate會插入已經設置了父ID的孩子。
+0

奶頭,我不能多謝你!我選擇了選項2,它像一個魅力。我無法首先設置父引用,因爲我不想將該子項的屬性公開給WCF使用者。但是......按照你在#2中建議的方式做到這一點非常簡單直接,並且工作正常。如果只有我一週前發佈了這個問題! :) –