¿Es cierto que NHibernate ISession.save (newTransientEntity) solo devolverá el Id generado, pero NO actualizará la propiedad Id de la entidad?

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

Pregunta

Utilizando NHibernate.Mapping.Attributes, tengo una clase de entidad con algo como:

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

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

Digamos que si agrego una entidad transitoria al contexto de persistencia con un código como este:

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

Supongo que la afirmación será exitosa, pero el resultado real es falso. Tengo la impresión de que el método de guardar actualizará la propiedad Id de la entidad con el valor generado. He probado esto usando NHibernate 1.2 y 2.0 con resultados similares.

Entonces la pregunta es:

  • ¿Es este comportamiento (no actualizar el ID de la entidad) por diseño, o tengo una compilación incorrecta de NHibernate en mi máquina?
¿Fue útil?

Solución

No ha especificado el nombre del Id

En lugar de:

[Id]

debe especificar el nombre:

[Id(Name="Id")]

En el primer caso, la asignación generada es incorrecta:

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

mientras que en el segundo caso obtendrá la asignación correcta:

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

Observe el nombre = " Id " atributo que faltaba.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top