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

时间:2009-11-04 08:44:11

标签: nhibernate hibernate nhibernate-mapping orm hibernate-mapping

我有一个场景,我想为我的实体添加一些标准属性。这意味着我会有例如1个int和2个字符串属性应用于所有相关实体。我有超过100个映射文件,大多数但不是全部将是这些新属性的主机。在类中,它很容易定义;但是在映射中,除了创建实用程序或xslt并应用它(How to define reusable <generator> elements in hibernate mapping)之外,我没有找到任何引用。

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

thx任何回复

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" />

EDIT2: 我删除了已接受的解决方案,因为NH 2.1.1 XML实体不起作用(NH-1236)并且NH将抛出“此XML文档中禁止DTD”

5 个答案:

答案 0 :(得分:1)

这取决于您的类中如何实现这些属性。

如果它们都是在基类或接口中定义的,则可以在基类或接口中将它们映射一次,并使用union-subclass派生。有一些限制。请阅读this chapter in the NHibernate documentation

如果您决定将它们放在一个班级中,您可以将它们映射为用户类型。这将类似于组件,但您可以在用户类型中指定类型名称,长度和其他内容。您仍需要指定每个列名称。

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

答案 1 :(得分:0)

为您的特定情况创建特殊代码生成器是您唯一的选择。

答案 2 :(得分:0)

选项1:
- 在基类中定义这3个属性

- 您的实体是否从此基础继承

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

选项2:

- 将这3个属性定义为组件。

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

答案 3 :(得分:0)

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

答案 4 :(得分:0)

似乎只做这个,就是使用动态映射(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();

将它连线并准备好使用 对于大约85个班级,性能影响可以忽略不计