Два варианта от макушки моей головы ...
Каждый объект может иметь утвержденный флаг или утвержденную дату. (Это может быть инкапсулировано в общий базовый класс.) Вам может понадобиться составной ключ, включающий столбец утверждения (не рекомендуется - составные ключи не очень удобны), или каждый объект может иметь бизнес-ключ в дополнение к PK. Это будет означать одну таблицу на объект с несколькими дополнительными столбцами метаданных в каждой таблице для определения утвержденных. (Вы можете решить, сохранять ли все изменения или только самые последние.)
Другой вариант - две отдельные таблицы для каждого объекта. Вы можете сделать это, используя Entity Names, которые были введены в NH2.1. Проще всего показать пример. У нас есть только одно определение класса:
public class Foo {
public virtual int Id { get; set; }
public virtual string Name { get; set; }
}
У нас есть два файла hbm.xml. Обратите внимание на атрибут entity-name после класса. Это создает две таблицы, Foo1 и Foo2. (Вы можете выбрать свои собственные имена через атрибут таблицы.)
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" namespace="NhHacking" assembly="NhHacking">
<class name="Foo" entity-name="Foo1">
<id name="Id">
<generator class="native" />
</id>
<property name="Name"/>
</class>
</hibernate-mapping>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" namespace="NhHacking" assembly="NhHacking">
<class name="Foo" entity-name="Foo2">
<id name="Id">
<generator class="native" />
</id>
<property name="Name"/>
</class>
</hibernate-mapping>
Когда мы сохраняем сущности, мы предоставляем имя сущности с помощью операции:
var foo1 = new Foo {Name = "Foo1"};
var foo2 = new Foo {Name = "Foo2"};
session.Save("Foo1", foo1);
session.Save("Foo2", foo2);
Это позволяет вам выбрать, к какой таблице относится объект. Вы, конечно, захотите инкапсулировать имена сущностей в класс констант. Необходимо указать имя объекта для всех операций (session.Get (), session.Save (), session.Update (), session.Delete () и т. Д.)