代码之家  ›  专栏  ›  技术社区  ›  Jaguar

有没有办法定义n-hibernate映射的可重用属性?

  •  1
  • Jaguar  · 技术社区  · 16 年前

    我有一个场景,我想向我的实体添加一些标准属性。这意味着我将对所有相关实体应用例如1 int和2 string属性。我有100多个映射文件,大多数但不是全部将成为这些新属性的主机。在类中很容易定义这一点;然而,在映射中,除了创建一个实用工具或xslt并应用它之外,我没有找到其他参考( How to define reusable <generator> elements in hibernate mapping

    但是,我希望能够从这个“标准”映射中添加/修改/删除属性。

    Edit1:我想添加的映射示例

    <property name="TimeOfEdit" column="TimeOfEdit" type="DateTime" not-null="true"/>
    <many-to-one name="EditedBy" column="FK_EditedBy" cascade="save-update" not-null="true" />
    

    编辑2: 我删除了接受的解决方案,因为在NH2.1.1中,XML实体不起作用(NH-1236),NH将抛出一个“此XML文档中禁止DTD”

    5 回复  |  直到 9 年前
        1
  •  1
  •   Stefan Steinegger    16 年前

    这取决于这些属性在类中的实现方式。

    基类或接口 ,您可以在基类或接口中映射它们一次,并使用 union-subclass . 有一些限制。阅读 this chapter in the NHibernate documentation 关于它。

    如果您决定将它们组合到一个类中,您可以将它们映射为一个类

    还有另一个选择:你可以使用 XML实体 . 这是NHibernate支持的XML的一个相当原始的特性。阅读 this chapter in the NH reference documentation 提到它的地方。

        2
  •  0
  •   Aaron Digulla    16 年前

        3
  •  0
  •   UpTheCreek    16 年前


    -在基类中定义这3个属性

    -设置“每个类的表层次结构”

    备选案文2:

    -您可以将这3个属性的映射放在一个可重用的文件中。

        4
  •  0
  •   Aaron Fischer    16 年前

    fluentNHibernate ,它将为您简化映射工作。使用自动映射,您可能只需要一个抽象基类来定义这些属性。

        5
  •  0
  •   Jaguar    16 年前

    似乎唯一能做到这一点的方法就是使用动态映射( http://ayende.com/Blog/archive/2008/05/01/Dynamic-Mapping-with-NHibernate.aspx

    因此,因为我已经定义了一个接口,我的实体将用于新属性(比如IAuditable),所以只需在NH会话初始化时运行适当的代码即可

    Configuration cfg = new Configuration() Mappings mappings = cfg.CreateMappings(); 
    foreach (var persistentClass in mappings.Classes) 
    { 
       if (persistentClass.MappedClass is IAuditable)
       {
         ...
       }
    }
    

    然后

    cfg.BuildSessionFactory();