2013-05-29 119 views
0

我有以下類結構。映射與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自動映射的部件,也就是SearchWithWarrantSearchWithoutWarrant被存儲在相同的PoliceAssistance表處理。

問題

PoliceAssistance.Search.TargetsSearchTarget必須有許多一對多的關係 - 一個搜索可以包含許多目標和一個目標可以在許多搜索中顯示。

如果我在PoliceAssistance.Search指定單向.HasManyToMany()映射,我得到一個「空值違反非空約束」當我試圖挽救實體 - 即使兩個SearchWithWarrantSearchWithoutWarrant被實例化,並在列表中的至少一個Target

如果我嘗試雙向指定映射,通過引入public virtual IList<PoliceAssistance.Search> InSearches { get; set; }財產爲SearchTarget.HasManyToMany().Inverse()映射它,我得到一個映射錯誤,指出PoliceAssistance.Search不能被引用,因爲它沒有被映射(我猜的映射類型作爲組件AREN」考慮映射?)。

我應該如何解決這個問題?

回答

0

這個戰鬥多一些後,我放棄了試圖獲得的映射與PoliceAssistance.Search作爲工作組件,而是將其轉變爲單獨的實體。這需要最少的變化,並按預期工作:

// Classes 
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 : IEntity { 
     public virtual int Id { get; set; } 
     public virtual IList<SearchTarget> Targets { get; set; } 
    } 
} 

// Mapping 
public class PoliceAssistanceMap : IAutoMappingOverride<PoliceAssistance> { 
    public void Override(AutoMapping<PoliceAssistance> map) { 
     map.References(x => x.SearchWithWarrant) 
      .Cascade.All(); 
     map.References(x => x.SearchWithoutWarrant) 
      .Cascade.All(); 
    } 
} 

public class SearchMap : IAutoMappingOverride<PoliceAssistance.Search> { 
    public void Override(AutoMapping<PoliceAssistance.Search> mapping) { 
     mapping.HasManyToMany(x => x.Targets); 
    } 
} 
0

我對流利NHibernate引擎一無所知,但多對多的連接總是通過鏈接表/對象進行的。所以,我希望,你將有這樣的事情:

public class SearchTarget : IEntity 
{ 
    public virtual String Name { get; set; } 
    public virtual IList<Search_SearchTarget_Link> Searches { get; set; } 
} 

public class Search : IEntityComponent 
{ 
    public virtual IList<Search_SearchTarget_Link> Targets { get; set; } 
} 

public class Search_SearchTarget_Link : IEntity 
{ 
    public virtual Search search { get; set; } 
    public virtual SearchTarget searchtarget { get; set; } 
} 

public partial class PoliceAssistance 
{ 
    public virtual Search SearchWithWarrant { get; set; } 
    public virtual Search SearchWithoutWarrant { get; set; } 
} 

希望這有助於...

+0

Nhibernate爲您做到這一點。您定義了一個關係,並且任何表格(如果需要)都會自動創建並鏈接。 –

+0

是的,我已經明白它會做這樣的事情,但我只是說,通過將2個實體鏈接到1個鏈接實體來完成多對多關係。我認爲你現在正在做的事情不能被框架翻譯成數據庫模型,因爲它不是一個有效的數據庫多對多關係,這個技巧只能在代碼中使用。 – ikwillem

+0

除非我誤解了你的觀點,也就是NHibernate所做的 - 它會創建鏈接表並管理代碼端的轉換。我之前完成了它,它已經在許多不同的場景下工作過(甚至有一個幾乎完全像這樣,除了一個屬性而不是兩個)。但是,如果我找不到「適當的」解決方案,我將不得不這樣做。 –

相關問題