1

我有一个场景,我想向我的实体添加一些标准属性。这意味着我将有 1 个 int 和 2 个 string 属性应用于所有相关实体。我有超过 100 个映射文件,大多数但不是全部都是这些新属性的主机。在类中很容易定义它;然而,在映射中,除了创建实用程序或 xslt 并应用它(如何在休眠映射中定义可重用 <generator> 元素)之外,我没有找到任何参考。

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

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 Entities are not working (NH-1236) 并且 NH 将抛出“此 XML 文档中禁止 DTD”

4

5 回答 5

1

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

如果它们都在基类或接口中定义,您可以在基类或接口中将它们映射一次,然后使用union-subclass. 有一些限制。阅读NHibernate 文档中的这一章

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

还有另一种选择:您可以使用XML 实体。这是 NHibernate 支持的 XML 的一个相当原始的特性。请阅读NH 参考文档中提到的本章。

于 2009-11-04T09:00:22.270 回答
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 个课程,性能影响可以忽略不计

于 2009-11-17T09:33:13.243 回答
0

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

于 2009-11-04T14:32:59.523 回答
0

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

于 2009-11-04T08:58:56.703 回答
0

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

- 让你的实体从这个基础继承

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

选项 2:

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

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

于 2009-11-04T09:02:57.023 回答