我有以下類結構。映射與Fluent NHibernate的多對多關係,其中一個關係是組件
public class SearchTarget : IEntity {
public virtual String Name { get; set; }
}
public partial class PoliceAssistance {
public virtual Search SearchWithWarrant { get; set; }
public virtual Search SearchWithoutWarrant { get; set; }
public class Search : IEntityComponent {
public virtual IList<SearchTarget> Targets { get; set; }
}
}
IEntityComponent
確保PoliceAssistance.Search
如在功能NHibernate自動映射的部件,也就是SearchWithWarrant
和SearchWithoutWarrant
被存儲在相同的PoliceAssistance
表處理。
問題
PoliceAssistance.Search.Targets
和SearchTarget
必須有許多一對多的關係 - 一個搜索可以包含許多目標和一個目標可以在許多搜索中顯示。
如果我在PoliceAssistance.Search
指定單向.HasManyToMany()
映射,我得到一個「空值違反非空約束」當我試圖挽救實體 - 即使兩個SearchWithWarrant
和SearchWithoutWarrant
被實例化,並在列表中的至少一個Target
。
如果我嘗試雙向指定映射,通過引入public virtual IList<PoliceAssistance.Search> InSearches { get; set; }
財產爲SearchTarget
與.HasManyToMany().Inverse()
映射它,我得到一個映射錯誤,指出PoliceAssistance.Search
不能被引用,因爲它沒有被映射(我猜的映射類型作爲組件AREN」考慮映射?)。
我應該如何解決這個問題?
Nhibernate爲您做到這一點。您定義了一個關係,並且任何表格(如果需要)都會自動創建並鏈接。 –
是的,我已經明白它會做這樣的事情,但我只是說,通過將2個實體鏈接到1個鏈接實體來完成多對多關係。我認爲你現在正在做的事情不能被框架翻譯成數據庫模型,因爲它不是一個有效的數據庫多對多關係,這個技巧只能在代碼中使用。 – ikwillem
除非我誤解了你的觀點,也就是NHibernate所做的 - 它會創建鏈接表並管理代碼端的轉換。我之前完成了它,它已經在許多不同的場景下工作過(甚至有一個幾乎完全像這樣,除了一個屬性而不是兩個)。但是,如果我找不到「適當的」解決方案,我將不得不這樣做。 –