Правда ли, что NHibernate ISession.save(newTransientEntity) будет возвращать только сгенерированный идентификатор, но НЕ обновлять свойство Id объекта?
-
03-07-2019 - |
Вопрос
Используя NHibernate.Mapping.Attributes, у меня есть класс сущности примерно такого типа:
[Class]
public class EntityA
{
...
[Id][Generator(class="guid")]
public Guid Id {...}
[Property]
public string Property1 {...}
...
}
Допустим, я добавляю временный объект в контекст персистентности с помощью такого кода:
...
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
...
Я предполагаю, что утверждение будет успешным, но фактический результат ложный.У меня сложилось впечатление, что метод сохранения обновит свойство Id объекта сгенерированным значением.Я проверил это, используя NHibernate 1.2 и 2.0, и получил аналогичный результат.
Итак, вопрос:
- Является ли такое поведение (не обновление идентификатора объекта) задуманным, или у меня на компьютере неправильная компиляция NHibernate?
Решение
Вы не указали имя идентификатора
Вместо:
[Id]
необходимо указать имя:
[Id(Name="Id")]
В первом случае сгенерированное сопоставление неверно:
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2">
<class name="Test.EntityA, test">
<id type="Guid">
<generator class="guid" />
</id>
</class>
</hibernate-mapping>
а во втором случае вы получите правильное сопоставление:
<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>
Обратите внимание на атрибут name="Id", который отсутствовал.
Не связан с StackOverflow