É verdade que NHibernate ISession.save (newTransientEntity) só retornará gerado Id, mas não atualizar a propriedade ID da entidade?
-
03-07-2019 - |
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?
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