É verdade que NHibernate ISession.save (newTransientEntity) só retornará gerado Id, mas não atualizar a propriedade ID da entidade?

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

Pergunta

Usando NHibernate.Mapping.Attributes, eu tenho uma classe de entidade com algo como:

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

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

Vamos dizer que se eu adicionar uma entidade transitória para o contexto de persistência com um 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
...

Suponho que o assert será um sucesso, mas o resultado real é falsa. Eu tenho a impressão de que o método Save irá atualizar a propriedade ID da entidade com o valor gerado. Testei isso usando tanto NHibernate 1,2 e 2,0, com resultados semelhantes.

Então a questão é:

  • É esse comportamento (não atualizar Id da entidade) por projeto, ou eu tenho compilação errado de NHibernate na minha máquina?
Foi útil?

Solução

Você não especificou o nome do Id

Em vez de:

[Id]

você deve especificar o nome:

[Id(Name="Id")]

No primeiro caso, o mapeamento gerado está errado:

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

enquanto no segundo caso, você receberá o mapeamento correto:

<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 o name = "Id" atributo que estava faltando.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top