Est-il vrai que NHibernate ISession.save (newTransientEntity) ne renverra que l'ID généré, mais PAS la mise à jour de la propriété Id de l'entité?

StackOverflow https://stackoverflow.com/questions/411127

Question

À l’aide de NHibernate.Mapping.Attributes, j’ai une classe d’entité avec quelque chose comme:

[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 un code comme celui-ci:

...
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
...

Je suppose que l'affirmation sera un succès, 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:

  • Ce comportement (ne met-il pas à jour l'identifiant de l'entité) est-il intentionnel ou ma compilation de NHibernate est-elle incorrecte sur ma machine?
Était-ce utile?

La solution

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

Au lieu de:

[Id]

vous devez spécifier le nom:

[Id(Name="Id")]

Dans le premier cas, le mappage généré est incorrect:

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

alors que dans le second cas, vous obtiendrez le bon mappage:

<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 le nom = " Id " attribut qui manquait.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top