Как сопоставить повторяющиеся столбцы в NHibernate без создания дублирующих свойств - PullRequest
0 голосов
/ 29 марта 2010

Учитывая базу данных с многочисленными повторяющимися столбцами, используемыми для аудита и управления версиями, как лучше всего смоделировать ее с помощью NHibernate, без необходимости повторять каждый из столбцов в каждом из классов в доменной модели?

Каждая таблица в базе данных повторяет те же девять столбцов, имена и типы идентичны, и я не хочу повторять ее в модели предметной области.

Я прочитал документы и увидел раздел, посвященный отображению наследования, но не мог понять, как заставить его работать в этом сценарии. Это похоже на общий сценарий, потому что почти каждая база данных, над которой я работаю, имеет четыре общих столбца аудита (CreatedBy, CreateDate, updatedBy, UpdateDate) почти в каждой таблице. Эта база данных ничем не отличается, за исключением того, что она содержит еще пять столбцов, которые являются общими для каждой таблицы.

Ответы [ 4 ]

2 голосов
/ 29 марта 2010

Используйте Свободный 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
}
0 голосов
/ 30 марта 2010

Этого можно достичь, используя элемент компонента в файле сопоставления.

Основная идея заключается в создании класса для хранения общих свойств и ссылки на него из каждой сущности в вашей модели.

Затем внутри вашего файла сопоставления добавьте ссылку на это свойство, например ...

<component name="RecordMetadata" class="RecordMetadata" insert="true" update="true">
    <property name="UpdatedBy" />
    <property name="UpdatedDate" />
    <property name="CreatedBy" />
    <property name="CreatedDate" />
</component>
0 голосов
/ 29 марта 2010

Вместо отображения вручную, используйте ConfORM .

Во многих случаях он сделает всю работу за вас. Когда это не так, очень легко определить ваши соглашения и переопределения.

0 голосов
/ 29 марта 2010

Используя генерацию кода 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>

Последним шагом было бы установить действие сборки выходного файла на Embedded Resource, и вы должны быть в порядке.

Подробнее о генерации кода t4 можно прочитать здесь: http://www.hanselman.com/blog/T4TextTemplateTransformationToolkitCodeGenerationBestKeptVisualStudioSecret.aspx

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...