你如何映射一个实体 - >使用Fluent NHibernate的接口关系?

时间:2009-06-20 18:49:19

标签: nhibernate fluent-nhibernate

给出以下类定义:

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

我有这个(流利的)映射

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

并获得此异常:表Orders中的关联引用了一个未映射的类,这是有道理的,因为它不知道我将传递给它的实现。

我明白为什么我必须在映射中定义类型(IProduct可能是任何东西),但我不知道该怎么做。

谢谢,

凯尔

4 个答案:

答案 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