Пропускане на нова/преходна стратегия за генериране на ID на NHibernate обект, когато ID вече е предоставен

Само накратко ... Имам следната стратегия за генериране на ID за един от моите картографирани класове:

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

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

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

Въпреки това горната стратегия за генериране на ID презаписва всяка стойност, предоставена за нови/преходни обекти.

Каква е поправката? Ще трябва ли да премахна стратегията за генериране и да присвоя собствени 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; където първият guid е генериран, а вторият е присвоеният. гадно :( - 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