2012-02-11 80 views
3

我的目標是使用NHibernate架構生成和Fluent NHibernate的automapper來生成我的數據庫。我遇到了我稱之爲「單向多對多關係」的問題。流利的NHibernate自動映射:一對多的實體,多對多的後端?

我的許多實體都有本地化資源。一個單獨的類可能是這樣的:

public class Something { 
    public virtual int Id {get; private set;} 
    public virtual Resource Title {get;set;} 
    public virtual Resource Description {get;set;} 
    public virtual IList<Resource> Bullets {get;set;} 
} 

Resource類沒有任何引用回;這些都是完全單向的。

public class Resource { 
    public virtual int Id {get; private set;} 
    public virtual IList<LocalizedResource> LocalizedResources {get;set;} 
    // etc. 
} 
public class LocalizedResource { // 
    public virtual int Id {get; private set; } 
    public virtual string CultureCode {get;set;} 
    public virtual string Value {get;set;} 
    public virtual Resource Resource {get;set;} 
} 

沒有IList<Resource>,一切都發生,我會想 - 資源ID是在TitleDescription領域。但是,當我添加IList時,NHibernate將字段something_id添加到Resource表中。我明白爲什麼會這樣做,但在這種情況下,這不是一種可持續的方法。

我想要的是爲子彈創建聯結表。喜歡的東西:

CREATE TABLE SomethingBullet (
    Id int NOT NULL PRIMARY KEY IDENTITY(1,1), 
    Something_Id int NOT NULL, 
    Resource_Id int NOT NULL 
) 

這樣,當我添加了其他26多實體爲我不會跟一個可笑的寬而疏Resource表來結束該數據庫。

如何指示Automapper以這種方式對待所有IList<Resource>屬性?

回答

4

每個多對多實際上都是由一對多的對象模型組成的。如果你的關係不需要是雙向的,就不要映射第二面。映射端的映射完全不受影響:

HasManyToMany(x => x.Bullets).AsSet(); 

在這種情況下,NHibernate已經知道它需要生成中間表。

請參閱這篇文章的many-to-many提示。

+0

+1 - 檢查鏈接的博客以瞭解如何做映射既FNH和代碼的新NH映射了很好的指導。 – 2012-02-13 17:24:24

0

:)

我發現,以與自動映射這項工作是通過構建自己的自定義自動映射步驟,並且取代「本土」 HasManyToManyStep的唯一途徑。恐怕這不是或者是超越。

我從Samer Abu Rabie, posted here中解僱了我的礦工。

好消息是,到目前爲止,Samer的代碼似乎完美地與我的約定和whatnots一起工作,所以,一旦到位,它對我的​​代碼中的其他任何內容都是完全透明的。

壞消息是,它的成本你有單向一個一對多的關係的能力,作爲薩默爾的代碼假定所有 X一對多的單向關係,很多一對多。根據你的模型,這可能會或可能不會是一件好事。

大概你可以編寫一個不同的ShouldMap實現來區分你想要的是多對多還是你想要成爲一對多,然後所有東西都可以再次工作。請注意,這將需要有兩個自定義步驟來取代本機HasManyToManyStep,雖然再次,Samer的代碼是一個很好的起點。

讓我們知道它是如何發展的。 :)

乾杯,
J.

相關問題