2012-03-09 3 views
6

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

Является ли мой единственный вариант написать собственный генератор?

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

ответ

1

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

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

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

<generator class="assigned" /> 

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

+0

Нет, у меня нет. Я не верю, что это сработает, поскольку оно учитывает значение не-0 как сохраненное. Который может и не быть. Так как я хочу создать Guid. Я буду устанавливать значения, отличные от 0, на Id. – wasabi

+0

Ах, тогда это не так, вопрос был непонятен. – Rippo

+0

Гош. Подумал, что я это ясно изложил. – wasabi

2

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

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

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

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

class Entity 
{ 
    Guid id; 

    Entity(Guid id = Guid.Empty) 
    { 
    if (id == Guid.Empty) this.id = Guid.NewGuid(); 
    else this.id = id; 
    } 
} 
+0

Я не следую. Объект IS новый. Я просто хочу, чтобы мой код пользователя вручную установил значение Id, прежде чем вызывать «Сохранить». Точно так же, как «назначено», за исключением того, что ему нужно работать, если Id == Guid.Zero – wasabi

+0

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

+0

Стефан, было бы, кроме того, что я хочу сделать то и другое. – wasabi

Смежные вопросы