0

繼從NHibernate one-to-one vs 2 many-to-one維護多個一到多

是否有一個簡單的方法來維護多個一到其中許多被用作僞一個一對一的關係。

enter image description here

例如

如果我有兩個實體,用戶和聯繫人,它們通過每個(User.ContactId和Contact.UserID)上的FK相關聯。

什麼是最好的方式來維護每個參考指向另一個。系統使用不同的聯繫人更新用戶是錯誤的,但聯繫人仍然引用用戶...

回答

2

如果您刪除多餘的外鍵之一,那麼很有可能您不需要維護它。您的數據庫架構不應該允許這樣的異常(userX引用contactX,但contactX引用userY)。從概念上講,用戶和聯繫人之間有一對一的關係。爲什麼不在NHibernate映射中進行一對一的操作?如果這是因爲惰性加載是not supported對於可爲空在NHibernate中一對一嗎?這個問題的解決方案不涉及數據庫中的冗餘外鍵。

1)在用戶映射中定義一個僞造列表。列表只能有一個或零個項目。零被視爲NULL(不接觸)。

<bag 
    name="_contact" 
    table="UserContacts" 
    lazy="true" 
    inverse="true" 
    cascade="all-delete-orphan" > 

    <key column="UserId" /> 
    <one-to-many class="Contact" /> 
</bag> 

在聯繫映射定義一個一對一:

<one-to-one name="_user" class="User" constrained="true" /> 

在你需要有PK Users.Id和一個外鍵Contacts.UserID數據庫(!)。

2)另一種選擇是簡單的有很多一對一的用戶映射和一個FK Users.ContactId

<many-to-one 
    name="_contact" 
    column="ContactId" 
    cascade="all-delete-orphan" 
    unique="true" 
    lazy="proxy"/> 

無論哪種方式,你問是不是需要和異常是不可能的維護。