Правда ли, что NHibernate ISession.save(newTransientEntity) будет возвращать только сгенерированный идентификатор, но НЕ обновлять свойство Id объекта?

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

Вопрос

Используя 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", который отсутствовал.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top