2011-03-25 120 views
1

我想在我的應用程序中創建一對一的映射,我嘗試了幾個在Stackoverflow和其他地方找到的示例,但沒有迄今爲止成功。如何使用映射屬性在NHibernate中創建一對一的映射

我有一個訂單類和一個預訂類。若干訂單可以在沒有預訂的情況下存在,但預訂必須始終有訂單。

我的計劃是把FK的預約表,代碼如下:

class Order 
    { 
    ... 
    [OneToOne(Cascade = "all-delete-orphan")]   
    public Reservation Reservation 
    { 
     get; 
     private set; 
    } 
    } 

和類預約:

class Reservation 
{ 
    ... 
    [ManyToOne(Column = "order_id", NotNull=true, Unique=true)]   
    public Order Order 
    { 
     get; 
     set; 
    } 
} 

這工作得很好,但是當我嘗試刪除一個訂單:

session.Delete(myOrder); 
session.FlushSession(); 

由於預訂FK爲空,我得到一個FK衝突異常,但由於Cascade參數,我期待自動刪除預留。

有什麼建議嗎?

謝謝

+0

我不知道它是如何與屬性的工作,但你可能需要設置'在訂單預約財產逆= TRUE;。 – ChrisAnnODell 2011-03-25 14:09:36

+0

看起來你並沒有'Order'和'Reservation'之間的1對1關係,而是多對一的關係,Chris說,你需要將其中的一個標記爲'inverse = true'。 – R0MANARMY 2011-03-25 14:24:40

+0

ChrisAnnODell:我在Order類的Reservation屬性中看不到inverse選項。 R0MANARMY os的地方建議像我一樣使用ManyToOne,我發現問題,請參閱下面的答案。 – bcsanches 2011-03-26 02:39:00

回答

0

我已經找到了問題:當訂單加載,這是試圖用一個條款,喜歡尋找一個保留:「WHERE order.id = revervation.id」,但實際上它需要檢查預訂表中的FK:「WHERE order.id = reservation.order_id」

因此,保留從未正確加載,當訂單被刪除時,沒有保留被刪除,結果是訂單被刪除從數據庫和沖洗發佈時,違反FK約束,因爲保留仍然存在。

爲了解決這個問題,我改變了令代碼:

[OneToOne(Cascade="all-delete-orphan", ForeignKey="none", PropertyRef="Order", Lazy=Laziness.Proxy)]   
    public Reservation Reservation 
    { 
     get; 
     private set; 
    } 

注意 「PropertyRef」 參數。

謝謝