È vero che NHibernate ISession.save (newTransientEntity) restituirà solo l'ID generato, ma NON l'aggiornamento della proprietà Id dell'entità?

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

Domanda

Usando NHibernate.Mapping.Attributes, ho una classe di entità con qualcosa del tipo:

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

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

Diciamo se aggiungo un'entità transitoria al contesto di persistenza con un codice come questo:

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

Suppongo che l'asserzione avrà successo, ma il risultato effettivo è falso. Ho l'impressione che il metodo di salvataggio aggiornerà la proprietà Id dell'entità con il valore generato. Ho provato questo usando NHibernate 1.2 e 2.0 con risultati simili.

Quindi la domanda è:

  • Questo comportamento (non aggiorna l'ID dell'entità) in base alla progettazione o ho una compilazione errata di NHibernate nella mia macchina?
È stato utile?

Soluzione

Non hai specificato il nome dell'ID

Invece di:

[Id]

dovresti specificare il nome:

[Id(Name="Id")]

Nel primo caso la mappatura generata è errata:

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

mentre nel secondo caso otterrai la mappatura corretta:

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

Nota il nome = " Id " attributo mancante.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top