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

Nhibernate 有没有办法定义n-hibernate映射的可重用属性?,nhibernate,hibernate,nhibernate-mapping,orm,hibernate-mapping,Nhibernate,Hibernate,Nhibernate Mapping,Orm,Hibernate Mapping,我有一个场景,我想向我的实体添加一些标准属性。这意味着我将对所有相关实体应用例如1 int和2 string属性。我有100多个映射文件,大多数但不是全部将成为这些新属性的主机。在类中很容易定义这一点;但是,在映射中,除了创建一个实用工具或xslt并应用它()之外,我找不到其他引用 但是,我希望能够从这个“标准”映射中添加/修改/删除属性 谢谢你的回复 Edit1:我想添加的映射示例 <property name="TimeOfEdit" column="TimeOfEdit" type=

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

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

谢谢你的回复

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”

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

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

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

如果它们都是在基类或接口中定义的,则可以在基类或接口中映射它们一次,并使用
联合子类
进行派生。有一些限制。读一读

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


还有另一种选择:您可以使用XML实体。这是NHibernate支持的XML的一个相当原始的特性。阅读其中提到的内容。

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

如果它们都是在基类或接口中定义的,则可以在基类或接口中映射它们一次,并使用
联合子类
进行派生。有一些限制。读一读

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

还有另一种选择:您可以使用XML实体。这是NHibernate支持的XML的一个相当原始的特性。阅读其中提到的内容。

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

-让您的实体从此基础继承吗

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

备选案文2:

-将这3个特性定义为组件

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

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

-让您的实体从此基础继承吗

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

备选案文2:

-将这3个特性定义为组件


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

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

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

似乎唯一能做到这一点的方法就是使用动态映射()

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

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

cfg.BuildSessionFactory();
将其接线并准备好使用
对于大约85个类,性能影响可以忽略不计。似乎唯一可以做到这一点的方法是使用动态映射()

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

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

cfg.BuildSessionFactory();
将其接线并准备好使用
对于大约85个类,性能影响可以忽略不计

XML实体似乎是最好的解决方案,但我不理解这样一句话:“这种方法的缺点是,在执行多态查询时,NHibernate不会生成SQL联合。”在NH使用映射之前,是否将适当的XML与映射结合起来?除此之外,我在创建它时遇到了困难,我似乎找不到一个XML实体使用的工作示例。最后,我确实让它与XML实体一起工作,但是用它来定义-ies是非常不可能的。定义xml可能只有一个根节点,因此只有-s才是真正可行的-ing是不可行的,类xml实体需要一个元素似乎是最好的解决方案,但我不理解这样一句话“这种方法的缺点是NHibernate在执行多态查询时不生成SQL联合。”在NH使用映射之前,适当的xml不是与映射相结合吗?除此之外,我在创建它时遇到了困难,我似乎找不到一个XML实体使用的工作示例。最后,我确实让它与XML实体一起工作,但是用它来定义-ies是非常不可能的。定义xml可能只有一个根节点,因此只有-s才是真正可行的-不可行,类需要一个元素不幸的是,组件解决方案需要一个额外的类,而这正是我想要的。第一个选项是可行的,但我希望避免,因为抽象类的子类是在抽象类的映射文件中定义的,而我更喜欢一个解决方案,在那里我转到a的类映射文件,并定义(以某种方式)我希望继承/注入抽象类的属性不幸的是,组件