Генератор NHibernate Guid, если новый - PullRequest
6 голосов
/ 10 марта 2012

Я бы хотел, чтобы NHibernate генерировал направляющие для сущностей, только если они не установлены вручную пользователем или приложением.По сути, при сохранении объектов с новым Guid () (все нули) NHibernate должен генерировать один.При сохранении объекта, который имеет ненулевой Guid, он должен использовать его вместо этого.

Является ли мой единственный вариант написать свой собственный генератор?Я осведомлен о «назначен».Я должен был указать, что я знал об этом.Так как он не делает то, что я хочу, это не тот вариант, который я ищу.Написание собственного генератора - вариант, который работает, но я бы хотел кое-что еще.Я подозреваю, что больше ничего нет.

Ответы [ 2 ]

2 голосов
/ 14 марта 2012

Проблема здесь в том, что NH должен знать, является ли объект новым или уже существует. Обычно это делается путем установки идентификатора.

Если вы написали свой собственный генератор, это не решит проблему, потому что он вызывается только если объект новый.

  • Вы можете использовать генератор assigned.
  • Вы можете использовать столбец версии, чтобы указать, является ли объект новым. Я никогда не пробовал это так, но это должно работать. НЕ имея никаких указаний на NH, если объект новый, вызывает довольно много проблем. Поверь мне.
  • Вы также можете иметь целое число в качестве первичного ключа и GUID в качестве обычного уникального поля.

Я бы сгенерировал идентификатор в конструкторе класса

class Entity
{
  Guid id;

  Entity(Guid id = Guid.Empty)
  {
    if (id == Guid.Empty) this.id = Guid.NewGuid();
    else this.id = id;
  }
}
1 голос
/ 10 марта 2012

Вы пытались установить атрибут unsaved-value?

<id name="Id" column="Id" type="Guid" unsaved-value="00000000-0000-0000-0000-000000000000">
  <generator class="guid.comb" />
</id>

edit Теперь я полностью понимаю ваш вопрос, вместо использования собственного генератора -

.
<generator class="assigned" /> 

Однако вы не можете использовать SaveOrUpdate().Вместо этого вы должны явно указать NHibernate, должен ли объект быть сохранен или обновлен, вызывая либо метод Save (), либо Update () ISession.Также вам всегда нужно будет устанавливать GUID вручную на всех ваших НОВЫХ объектах.Это вариант.

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