2010-03-29 65 views
0

如果数据库有许多用于审计和版本控制的重复列,那么使用NHibernate对其进行建模的最佳方式是什么,而不必重复每个列的域模型中的类?如何在NHibernate中映射重复列而不创建重复属性

数据库中的每个表都重复这9列,名称和类型相同,我不想在域模型中复制它。

我已阅读文档,并且看到了关于继承映射的部分,但我无法看到如何在此场景中使其工作。这似乎是一个常见的情况,因为几乎每个我工作的数据库几乎在每个表中都有四个常见的审计列(CreatedBy,CreateDate,UpdatedBy,UpdateDate)。这个数据库没有什么不同,只是它引入了另外五列,这些列对每个表都是通用的。

回答

0

这可以通过使用映射文件中的组件元素来完成。

基本的想法是创建一个类来保存公共属性并从模型中的每个实体引用它。

然后你的映射文件中的引用添加到该属性是这样的...

<component name="RecordMetadata" class="RecordMetadata" insert="true" update="true"> 
    <property name="UpdatedBy" /> 
    <property name="UpdatedDate" /> 
    <property name="CreatedBy" /> 
    <property name="CreatedDate" /> 
</component> 
0

使用t4代码生成,您应该能够编写一个单一的代码生成文件,该文件输出一个包含您定义的所有类的单个.hbm.xml文件。我想像下面这样。首先,创建与.tt扩展名的文件,并把下面的代码:

<#@ template language="C#v3.5" #> 
<#@ output extension="hbm.xml" #> 
<?xml version="1.0" encoding="utf-8" ?> 
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" namespace="MyNameSpace"> 
<# 
System.Collections.Generic.Dictionary<string, string> classes = new System.Collections.Generic.Dictionary<string, string>(); 
classes.add("RootNameSpace.SubNameSpace.MyClass1", "Table1"); 

foreach(string className in classes.keys) 
{ 
#> 
    <class name="<#=className#>, AssemblyName" table="<#=classes[className]#>"> 
    <id name="ID" column="EntityID" type="Int32"> 
     <generator class="native" /> 
    </id> 
    <property name="Property1" /> 
    <property name="Property2" /> 
    </class> 
<# 
} 
#> 
</hibernate-mapping> 

最后一步是设置输出文件的生成操作嵌入的资源,你应该是好去。

你可以阅读更多关于T4代码生成这里:用手 http://www.hanselman.com/blog/T4TextTemplateTransformationToolkitCodeGenerationBestKeptVisualStudioSecret.aspx

+0

好主意使用T4,但我仍然有相同的九种属性添加到我所有的实体,这是我想避免。 – 2010-03-29 01:39:19

+0

我想我没有看到这个问题,只要你只需要在一个地方编辑九个属性即可。 – 2010-03-29 07:17:16

+0

我不担心编辑映射文件,你建议T4我已经使用代码片段,我的问题是... 鉴于一个数据库有许多用于审计和版本控制的重复列,什么是最好的方法使用NHibernate进行建模,而不必在域模型中的每个类中重复每个重复列? – 2010-03-29 09:36:34

0

相反的映射,使用ConfORM

在很多情况下,它会为你做的工作全部工作。如果没有,定义约定和覆盖非常容易。

2

使用Fluent NHibernate来创建您的映射文件。这允许您在映射文件中使用继承。例如:

public class AuditableClassMap<T> : ClassMap<T> where T : IAuditable 
{ 
    public AuditableClassMap() 
    { 
     Map(x => x.CreatedBy); 
     Map(x => x.CreatedDate, "CreatedDt"); 
     Map(x => x.RevisedBy); 
     Map(x => x.RevisedDate, "RevisedDt"); 
    } 
} 

public class CompanyMap : AuditableClassMap<Company> 
{ 
    // mapping for Company 
}