2012-01-24 217 views
8

這裏是我的情況..
假設你有以下的模型實體,這代表了他們自己的單個表:

電影 [Movie_Id,名稱,等級,..]
演員 [Actor_Id,名字,姓氏,..]
主任 [DIRECTOR_ID,名字,姓氏,..]

而所謂的 「建議」 的另一個實體/表,重新在網站內的用戶之間呈現推薦。這個想法是推薦可以是任何類型的,即有人推薦一個演員,或某人推薦一部電影。基本上,這個表應該是這個樣子:

建議 [Recommendation_Id,OBJECT_ID,OBJECT_TYPE,..]

這裏就是我卡住了進去。我如何將這些關係映射到nHibernate中與Fluent? 我的意思是..雖然映射,我不能指定類型(哪個表相關)'因爲這是在運行時確定的,但我不能只依靠Id本身,因爲它不能暗示屬於哪個表。
例如,假設這個紀錄上建議表:

Recommendation_Id - OBJECT_ID - OBJECT_TYPE
83001--401--- 「M」

基本上我存儲字符識別(在這種情況下「 M「代表表」電影「)來知道表Object_Id屬於哪個表。我不能只存儲Object_Id而沒有Object_Type ..
映射與功能NHibernate多個表

作爲最終評論,我想補充一點,我已經看到了所有的每類表,每表的子類,每表的具體類例如,但我相信這些都不適合這種情況,因爲Movies_Id,Actors_Id,Directors_Id,...都是不同的,Recommendations_Id也是如此。我的意思是,這裏沒有基類的子類繼承,他們根本不共享Id。

我希望我能讓自己清楚。 在此先感謝。

+0

應當注意的是,功能NHibernate目前不支持多點到任意點是什麼,我想這會做。除非我錯了,否則在更新電影時保存建議不會無縫地發生。Daniel的答案更接近於我能找到的其他任何東西; o) – JasonCoder

+0

如果你想映射'any'關係的另一端,就像'Movie.Recommendations'中那樣,我相信你可以用'one to-many'和'where =「Object_Type ='M'」'屬性,您可以使用Fluent NHibernate進行操作。 –

回答

11

您正在尋找的NHibernate映射是<any/>。這裏有一些資源,幫助你得到了這個NHibernate的映射功能,以加快:

我相信*的.hbm.xml你是拍攝是這樣的:

<class name="Recommendation" table="Recommendations"> 
    <id name="Id"> 
    <column name="Recommendation_Id" /> 
    <generator class="native"/> 
    </id> 

    <any name="RecommendedObject" id-type="System.Int32" meta-type="System.String"> 
    <meta-value value="M" class="Movie"/> 
    <meta-value value="A" class="Actor"/> 
    <meta-value value="D" class="Director"/> 
    <column name="Object_Type"/> 
    <column name="Object_Id"/> 
    </any> 

    <!-- other stuff ... --> 
</class> 

你應該能夠做到與功能NHibernate像這樣在建議的映射:

ReferencesAny(x => x.RecommendedObject) 
    .IdentityType<int>() 
    .EntityTypeColumn("Object_Type") 
    .EntityIdentifierColumn("Object_Id") 
    .AddMetaValue<Movie>("M") 
    .AddMetaValue<Actor>("A") 
    .AddMetaValue<Director>("D"); 
+0

非常感謝!!!!我測試過它,似乎工作正常。非常感謝Daniel! :=) –

+0

你能舉一個例子說明如何通過'Object_Id'過濾來查詢'object RecommendedObject'嗎? –

+0

@Christian,你指的是http://stackoverflow.com/questions/21940396/fluentnhibernate-referencesany-how-to-use-queryover-with-filter? –