NHibernate сохранить объект изменения для утверждения - PullRequest
1 голос
/ 01 декабря 2010

Я создаю приложение, которое позволяет пользователям вносить изменения в объекты, но эти изменения должны быть утверждены, прежде чем они станут постоянными.Я использую NHibernate.

Как бы вы справились с такого рода сценариями, используя?Есть ли какие-нибудь статьи, посвященные этой проблеме?

Я думаю о двух таблицах для каждого объекта.Один для текущего состояния и один для предлагаемого состояния.Затем наличие объекта Generic ChangeRequest, в котором указывается Удалить / Вставить / Обновить и тему, которую нужно изменить.Но я не верю, что NHibernate позволит вам иметь два разных сопоставления для одного и того же объекта.

Ответы [ 2 ]

1 голос
/ 02 декабря 2010

Два варианта от макушки моей головы ...

Каждый объект может иметь утвержденный флаг или утвержденную дату. (Это может быть инкапсулировано в общий базовый класс.) Вам может понадобиться составной ключ, включающий столбец утверждения (не рекомендуется - составные ключи не очень удобны), или каждый объект может иметь бизнес-ключ в дополнение к 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 () и т. Д.)

0 голосов
/ 02 декабря 2010

В вашем случае я бы предложил, чтобы у каждого объекта был следующий дизайн: PropertyName, PropertyValue, PropertyStatus (обработанный / утвержденный).Благодаря этому дизайну вы можете изменять ваши объекты любым способом, сохраняя одно сопоставление для файла.Например, если таблица персоны должна иметь столбцы ssn, name, дата рождения .... В этом дизайне у вас будет 3 строки:

In regular design
-----------------
ColumnName   ColumnValue
ID           1
ssn          123
name         xyz
birthdate    dd/mm/yyy

This will be
------------
PropertyName   PropertyValue   ObjectID   PropertyStatus
ssn            123             1          approved
name           xyz             1          approved
birthdate      dd/mm/yyyy      1          approved

Представьте, что это вертикальная таблица, в которой строкиколонка и наоборот.

...