2009-06-20 117 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

相关问题