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

如何映射实体->;使用Fluent NHibernate的接口关系?,nhibernate,fluent-nhibernate,Nhibernate,Fluent Nhibernate,给定以下类定义: public class Order { public IProduct Product {get;set;} } 我有这个(流畅的)映射 得到这个异常:来自表Orders的关联引用了一个未映射的类,这很有意义,因为它不知道我将传递给它什么实现 我理解为什么我必须在映射中定义类型(IPProduct可以是任何类型),但我不确定如何做 谢谢 Kyle尝试映射接口IProduct,而不是具体的类Product。(注意,我不是说映射类订单的产品字段)您可以使用适当的继承模型将接

给定以下类定义:

public class Order {
  public IProduct Product {get;set;}
}
我有这个(流畅的)映射

得到这个异常:来自表Orders的关联引用了一个未映射的类,这很有意义,因为它不知道我将传递给它什么实现

我理解为什么我必须在映射中定义类型(IPProduct可以是任何类型),但我不确定如何做

谢谢


Kyle

尝试映射接口
IProduct
,而不是具体的类
Product
。(注意,我不是说映射类
订单
产品
字段)

您可以使用适当的继承模型将接口->实现关系映射为继承关系

这意味着映射IPProduct,然后在IPProduct映射中创建Product的子类映射,例如使用每个层次结构的表


这还可以让您映射产品类中不属于IPProduct接口的其他数据,如果您愿意,还可以让您以相同的方式映射其他IPProduct实现。

我一直在努力改进Fluent中对代理接口的支持。问题256和257附带了几个有用的补丁,但它们确实需要手动指定的所有内容。我更进一步,添加了对设置代理和将引用类型从推断类(即代理)更改为底层映射类的支持,并添加了一个新约定(ProxyConvention)来自动设置它-只需使用从映射类派生代理接口的函数实例化它,剩下的就交给它了

目前的一个漏洞是,它无法获取.hbm.xml文件中明确指定的任何定义


该补丁附加到

我想你要找的是
.References(x=>x.Product,“ProductId”)

顺便说一句,
也是如此。HasMany

这似乎与xml中的
相同


我不建议映射到接口,因为它破坏了使用一个接口的全部意义-一旦它开始实现IStorable,您就会遇到问题,NH无法处理多重继承。

感谢这个答案-我发现它非常有用,并且是我选择的方法操作,很好的调用,我改变了它,这是一个复制粘贴错误。
References(x=>x.Product, "ProductId");