Значения Nhibernate HiLo перед фиксацией - PullRequest
3 голосов
/ 05 марта 2012

Я разрабатываю приложение, с помощью которого пользователи могут отправлять электронные письма с вложениями. Объекты домена электронной почты и вложения hilo определены как генератор идентификаторов следующим образом:

<id name="Id">
  <generator class="hilo" />
</id>

Nhibernate создает схему с таблицей с именем hibernate_unique_key со столбцами next_hi.

Когда пользователь добавляет вложение в электронное письмо, внутренне приложение добавляет объект вложения в список вложений и привязывает его к представлению сетки, чтобы пользователи могли видеть, что они добавили. При желании пользователи могут выбрать ранее добавленное вложение и удалить его из списка, нажав кнопку «Удалить». Проблема заключается в том, что, поскольку ни один из объектов не сохранен в базе данных, идентификаторы вложений не были назначены, поэтому я не могу однозначно определить объект obj для удаления из списка.

Есть ли способ присвоить объекту значение id перед его сохранением? Думаю, я не совсем понимаю использование алгоритма hilo и его основная цель.

1 Ответ

4 голосов
/ 05 марта 2012

HiLo используется для того, чтобы идентификатор мог быть назначен без обратной передачи в базу данных. Что вам нужно сделать, это что-то вроде этого (вам нужно будет убрать вложения, обработать исключения и т. Д.):

private void CreateNewEmail_Click(object sender, EventArgs e)
{
    // start a transaction so that all our objects are saved together.
    this.transaction = this.session.BeginTransaction();
    this.currentEmail = new Email();
}

private void AddAttachment_Click(object sender, EventArgs e)
{
    var attachment = new Attachment();
    // set the properties.

    // Add it to the session so that the identifier is populated (no insert statements are sent at this point)
    this.session.Save(attachment);

    // Also add it to the email
    this.currentEmail.Attachments.Add(attachment);
}

private void SendEmail_Click(object sender, EventArgs e)
{
    // Commit the transaction (at this point the insert statements will be sent to the database)
    this.transaction.Commit();
}

Вот несколько ссылок, которые также могут помочь вам лучше понять HiLo и NHibernate:

http://ayende.com/blog/3915/nhibernate-avoid-identity-generator-when-possible

http://nhforge.org/blogs/nhibernate/archive/2009/03/20/nhibernate-poid-generators-revealed.aspx

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