2010-10-21 24 views
0

我嘗試將NHibernate映射到現有的數據庫結構。不幸的是我無法改變現有結構當NH保存子集合時,外鍵爲空

首先,我將提供一些背景,然後解釋這個問題本身

關係的分析很簡單: alt text

登錄的主要實體。他與表格有一對一的關係。 外鍵是FormID

買方&賣方是表單實體的集合。 應用程序應將表單實體與買方和賣方一起保存。

問題是由買方&賣方實體組成的主鍵。 從ForegineKey- 關鍵複合FormID和intenal排序INT號 - tdNum

這反映在以下形式FNH映射

public class FormLogMap : ClassMap<FormLog> 
{ 
    public FormLogMap() 
    { 
     Table("BillOfSaleLog"); 

     Id(x => x.FormId).Column("FormID").GeneratedBy.Native(); 
     .... 
     .... 
     References<Form>(x => x.Form, "FormID").LazyLoad().ReadOnly(); 
    } 
} 

public class FormMap : ClassMap<Form> 
{ 
    public FormMap() 
    { 

    Table("BillOfSaleForm"); 

     Id(x => x.Id).Column("FormID").GeneratedBy.Foreign("Log"); 
     ... 
     ... 

     HasOne<FormLog>(x => x.Log).Cascade.All(); 

     HasMany(x => x.Buyers).KeyColumn("FormID").Inverse().Cascade.All(); 

     HasMany(x => x.Sellers).KeyColumn("FormID").Inverse().Cascade.All(); 
    } 
} 


public class BuyerMap : ClassMap<Buyer> 
{ 
    public BuyerMap() 
    { 

     Table("BillOfSaleBuyer"); 

     CompositeId() 
        .KeyReference(x => x.Form, "FormID") 
        .KeyProperty(x => x.InnerOrderId, "tdNum1"); 

     .... 
     .... 
    } 
} 

Seller is exectly the same 

當我試圖保存時發生該問題實體的編輯動作 我正在使用MVC獲取用戶數據並使其成爲一個對象。 綁定工作正常,並使對象與集合。

但是當我保存收到以下錯誤的實體: alt text

我期望NHibernate的足夠聰明來設置買方賣方&外鍵。但實際上它們仍然沒有價值。

這個問題可以通過手動設置外鍵 如下面的代碼來解決:

 //i have to set the form proerty in the childs 
     //without of the lines NH will try to save the childs it with FormID = null 
     foreach (var buyer in form.Buyers) { buyer.Form = form; } 
     foreach (var seller in form.Sellers) { seller.Form = form; } 

但是我正在尋找一個優雅的和正確的解決方案

感謝您閱讀

回答

0

根據this的相關問題,HHibernate不支持使用組合鍵級聯工作(如在BuyerMap中所述)。其中一個答案確實包含了一個hack來解決這個問題,但最終會得到一個冗餘列。

+0

謝謝您的重播。我理解建議的解決方案,但它需要更改表格模式。 我會採取我上面提出的解決方案。 可以理解的是,映射笨拙的關係結構的能力是有問題的 – ari 2010-10-21 09:13:01

1

你不顯示添加買方或賣方以表格的代碼,但它應該是這樣的:

form.Buyers.Add(buyer); 
buyer.Form = form; 

因爲形式是關係的反向端,你必須設置參考在多方面形成。無論如何,您應該這樣做,以便內存中的對象是正確的。如果買方和賣方對象已經在同一個ISession中持久存在,那麼它應該可以工作。

+0

我上面提到過我通過數據綁定從編輯視圖獲得的表單對象。我沒有通過代碼來創建表單對象實例,這些代碼保證了對象之間的小問題。另一種選擇是除了賣方/買方的信息之外,還包括表單母公司的外鍵。解決問題很簡單。太糟糕了 .. – ari 2010-10-24 06:53:46