2009-01-04 5 views
2

Utilisation NHibernate.Mapping.Attributes, j'ai une classe d'entité avec quelque chose comme:Est-il vrai que NHibernate ISession.save (newTransientEntity) ne retournera que l'ID généré, mais ne mettra PAS à jour la propriété Id de l'entité?

[Class]  
public class EntityA 
{ 
    ... 
    [Id][Generator(class="guid")] 
    public Guid Id {...} 

    [Property] 
    public string Property1 {...} 
    ... 
} 

Disons que si j'ajoute une entité transitoire au contexte de persistance avec le code comme ceci:

... 
Guid id; 
using(ISession s = sessionFactory.OpenSession()) 
using(ITransaction t = s.BeginTransaction()) 
{ 
    EntityA entity = new EntityA(); 
    entity.Property1 = "Some Value"; 
    id = (Guid) s.Save(entity); 
    t.Commit(); 
    Assert.IsTrue(s.Contains(entity)); // <-- result: true 
} 


Assert.AreEquals(id, entity.Id); // <-- Result: false, Expexted: true 
... 

I supposons que l'affirmation sera réussie, mais le résultat réel est faux. J'ai l'impression que la méthode save mettra à jour la propriété Id de l'entité avec la valeur générée. J'ai testé cela en utilisant à la fois NHibernate 1.2 et 2.0 avec des résultats similaires.

La question est donc:

  • Est-ce comportement (pas de mise à jour Id de l'entité) par la conception, ou j'ai mal compilation de NHibernate dans ma machine?

Répondre

3

Vous n'avez pas spécifié le nom de l'Id

Au lieu de:

[Id] 

vous devez indiquer le nom:

[Id(Name="Id")] 

Dans le premier cas, la cartographie générée est faux:

<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"> 
    <class name="Test.EntityA, test"> 
    <id type="Guid"> 
     <generator class="guid" /> 
    </id> 
    </class> 
</hibernate-mapping> 

dans le second cas, vous obtiendrez la mise en correspondance correcte:

<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"> 
    <class name="Test.EntityA, test"> 
    <id type="Guid" name="Id"> 
     <generator class="guid" /> 
    </id> 
    </class> 
</hibernate-mapping> 

Notez que le attribut name = « Id » qui faisait défaut.

+0

Merci, ça marche! Je comptais trop sur le sérialiseur pour en déduire le nom de l'ID en fonction de la propriété à laquelle IdAttribute est appliqué. Merci encore. – Nordin

Questions connexes