代码之家  ›  专栏  ›  技术社区  ›  Kyle West

如何使用fluent nhibernate映射实体->接口关系?

  •  7
  • Kyle West  · 技术社区  · 15 年前

    给定以下类定义:

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

    我有这个(流畅的)地图

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

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

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

    谢谢,

    凯尔

    4 回复  |  直到 13 年前
        1
  •  2
  •   yfeldblum    15 年前

    尝试映射接口 IProduct 而不是混凝土等级 Product . (注意,我不是在说映射 产品 课堂领域 Order )

        2
  •  5
  •   Stu    13 年前

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

    顺便说一下,同样的情况也适用于 .HasMany<>

    这似乎和 <... class="Product" /> 用XML

    我不建议映射到接口,因为它打破了使用一个接口的全部要点——一旦它开始实现可历史性,就会遇到问题,而且NH不能处理多重继承。

        3
  •  1
  •   Erik Öjebo    15 年前

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

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

    这还允许您映射产品类中不属于IProduct接口一部分的其他数据,并允许您以相同的方式映射其他IProduct实现(如果希望)。

        4
  •  1
  •   Dave Warry    15 年前

    我一直在努力提高对流畅代理接口的支持。有几个有用的补丁附加到了问题256和257上,但它们确实需要手动指定所有内容。我更进一步,增加了对设置代理和更改从推断类(即代理)到基础映射类的引用类型的支持,并添加了一个新的约定(proxy convention)来自动设置所有这些内容-只需使用函数实例化它,从映射类派生代理接口,它应该照顾好剩下的。

    目前的一个漏洞是它无法获取任何在.hbm.xml文件中显式指定的定义。

    补丁连接到 issue 256