2009-06-20 113 views
7

給出下面的類定義:如何使用Fluent NHibernate映射實體 - >接口關係?

public class Order { 
    public IProduct Product {get;set;} 
} 

我有這個(流利)映射

References(x=>x.Product, "ProductId"); 

並得到此異常:從表中訂單的關聯是指未映射類,這是有道理的,因爲它不知道我將傳遞給它的實現。

我明白爲什麼我必須在映射中定義類型(IProduct可以是任何東西),但我不知道該怎麼做。

感謝,

凱爾

回答

2

嘗試映射接口IProduct,而不是具體類Product的。 (請注意,我不是在描繪類OrderProduct字段的映射。)

1

您可以使用適當的繼承模型將接口 - >實現關係映射爲繼承關係。

這將意味着映射IProduct,然後在IProduct映射中創建Product的子類映射,例如使用table-per-hierarchy。

這也可以讓您映射不屬於IProduct接口一部分的產品類中的其他數據,還可以讓您以相同的方式映射其他IProduct實現,如果您願意的話。

1

我一直在努力改進對Fluent代理接口的支持。問題256和257附帶了一些有用的補丁,但他們確實需要手動指定的所有內容。我已經採取了更進一步的措施,並增加了對設置代理的支持,並將推斷(這將是代理)的引用類型更改爲底層映射類,並添加了一個新約定(ProxyConvention),以便自動設置它 - 用一個函數實例化它以從映射類派生代理接口,並且應該處理其餘的部分。

目前的一個漏洞是它無法獲取在.hbm.xml文件中明確指定的任何定義。

補丁安裝到issue 256

5

我想你要找的是什麼.References<Product>(x=>x.Product, "ProductId");

順便同爲.HasMany<>

這似乎有一樣<... class="Product" />在XML

我不會推薦映射到接口,因爲它打破了使用接口的全部要點 - 只要開始實施IStorable和NH,就會遇到問題無法應對多重繼承。

+0

感謝您的回答 - 我發現它非常有幫助,並且是我選擇的方法 – Mike 2010-04-01 11:03:16

相關問題