2010-07-19 18 views
0

Juste un coup rapide ... J'ai la stratégie du générateur d'ID suivant pour une de mes classes mappées:Skipping une nouvelle/transitoire de la stratégie de générateur d'identité de l'entité NHibernate lorsqu'un ID est déjà fourni

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

L'entité en question est impliqué dans des comportements de synchronisation/fusion à partir desquels il est nécessaire d'avoir un identifiant global unique.

Lorsqu'une entité est créée pour la première fois sur une application client, sa propriété UID est affectée de sorte qu'elle soit la même valeur que l'entité équivalente sur le serveur. Toutefois, la stratégie de génération d'ID ci-dessus écrase toute valeur fournie pour les entités nouvelles/transitoires.

Quel est le correctif? Devrai-je supprimer la stratégie de générateur et attribuer mes propres GUID? Ou la stratégie du générateur est-elle configurable pour générer uniquement un guid.comb si nécessaire?

Répondre

0

Je pense que vous pouvez accomplir cela en faisant de l'UID un champ privé et en contrôlant l'accès à travers la propriété.

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 } 
    } 
} 
+0

ok merci, je vais essayer cela et vous revenir :) – Rabid

+0

Malheureusement NHibernate semble être le mettre à jour son état d'entité interne avec un UID généré, entraînant l'exception suivante: identifiant d'une instance de csl.Risk.Structure.RiskClass a été modifié de 12ae645e-c50f-4fc5-b0ff-9db900bd9a4e à 42e565c7-8dd3-416f-89a2-9db801086d93; où le 1er guid est généré et le second est assigné. Bummer :( – Rabid

+0

Nouvelle réponse: Vous devrez supprimer la stratégie du générateur et attribuer vos propres GUID. :-) –