给出以下类定义:
public class Order {
public IProduct Product {get;set;}
}
我有这个(流利的)映射
References(x=>x.Product, "ProductId");
并获得此异常:表Orders中的关联引用了一个未映射的类,这是有道理的,因为它不知道我将传递给它的实现。
我明白为什么我必须在映射中定义类型(IProduct可能是任何东西),但我不知道该怎么做。
谢谢,
凯尔
答案 0 :(得分:5)
我认为您正在寻找的是.References<Product>(x=>x.Product, "ProductId");
顺便提一下.HasMany<>
这似乎与xml
中的<... class="Product" />
相同
我不建议映射到接口,因为它打破了使用它的全部意义 - 一旦它开始实现IStorable就会遇到问题而NH无法应对多重继承。
答案 1 :(得分:2)
尝试映射接口IProduct
而不是具体的类Product
。 (注意,我不是在讨论映射类Product
的{{1}}字段。)
答案 2 :(得分:1)
您可以使用适当的继承模型将interface-&gt;实现关系映射为继承关系。
这意味着映射IProduct,然后在IProduct映射中创建Product的子类映射,例如使用table-per-hierarchy。
这也可以让您在不属于IProduct界面的产品类中映射其他数据,并且如果您愿意,还可以以相同的方式映射其他IProduct实现。
答案 3 :(得分:1)
我一直在努力改进Fluent中对代理接口的支持。问题256和257附带了几个有用的补丁,但它们确实需要手动指定的所有内容。我进一步采取了这些措施,并添加了对设置代理和将推断类型(可能是代理)更改为底层映射类的支持,并添加了一个新约定(ProxyConvention)来自动设置它 - 只是用一个函数实例化它,从映射的类派生代理接口,它应该处理其余的事情。
目前的一个漏洞是它无法获取.hbm.xml文件中明确指定的任何定义。
该补丁附加到issue 256