Пропуск стратегии генератора идентификаторов нового/временного объекта NHibernate, когда идентификатор уже предоставлен

Просто быстрый... У меня есть следующая стратегия генератора идентификаторов для одного из моих отображаемых классов:

<id name="UID" type="System.Guid">
    <column name ="UID" sql-type ="uniqueidentifier" />
    <generator class="guid.comb" />
</id>

Рассматриваемый объект участвует в поведении синхронизации/слияния, для которого необходимо иметь глобально уникальный идентификатор.

Когда объект создается в клиентском приложении в первый раз, его свойство UID назначается таким образом, чтобы оно совпадало со значением эквивалентного объекта на сервере.

Однако приведенная выше стратегия генератора идентификаторов перезаписывает любое значение, предоставленное для новых/временных сущностей.

Что исправить? Придется ли мне удалить стратегию генератора и назначить свои собственные идентификаторы GUID? Или стратегия генератора настраивается так, чтобы генерировать guid.comb только при необходимости?


person Rabid    schedule 19.07.2010    source источник


Ответы (1)


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

public class MyClass
{
    private Guid _uid;

    protected MyClass() { // parameterless ctor for NH }

    public MyClass(Guid uid) { _uid = uid; // assign on creation }

    public Guid Uid
    {
        get { return _uid; }
        private set { // do nothing or compare _uid to Guid.Empty and set }
    }
} 
person Jamie Ide    schedule 19.07.2010
comment
К сожалению, NHibernate, по-видимому, обновляет состояние своего внутреннего объекта сгенерированным UID, что приводит к следующему исключению: идентификатор экземпляра csl.Risk.Structure.RiskClass был изменен с 12ae645e-c50f-4fc5-b0ff-9db900bd9a4e на 42e565c7-8dd3- 416f-89a2-9db801086d93; где 1-й гид — сгенерированный, а второй — назначенный. Облом :( - person Rabid; 20.07.2010
comment
Новый ответ: вам придется удалить стратегию генератора и назначить свои собственные идентификаторы GUID. :-) - person Jamie Ide; 20.07.2010
comment
Я иду по этому пути, NHibernate.Id.GuidCombGenerator.Generate(null, null); действительно создает направляющую гребенки, так что я счастлив ... Будем надеяться, что это не сбивает с толку поведение обнаружения переходных процессов! Я поставлю тебе баллы, как только проверю это. - person Rabid; 20.07.2010