Дочерняя коллекция NHibernate SaveOrUpdate не обновлена ​​с помощью идентификаторов

Я явно что-то упускаю (надеюсь, очевидно), и мне пока не повезло с Google.

У меня есть родитель. -Детские отношения отображаются следующим образом

Упрощенная родительская карта

  public sealed class ParentMap : ClassMap<ParentEntity>
  {
    public ParentMap()
    {
      Table("Parent");
      Component(x => x.Thumbprint);
      Id(x => x.Id).GeneratedBy.Identity();

      Map(x => x.ServeralNotNullableProperties).Not.Nullable();

      HasMany(x => x.Children).KeyColumn("ChildId")
                              .Inverse()
                              .LazyLoad()
                              .Cascade
                              .AllDeleteOrphan();

      References(x => x.SomeUnrelatedLookupColumn).Column("LookupColumnId").Not.Nullable();
    }
  }

Упрощенная дочерняя карта

  public sealed class ChildMap : ClassMap<ChildEntity>
  {
    public ChildMap()
    {
      Table("Child");
      Component(x => x.Thumbprint);
      Id(x => x.Id).GeneratedBy.Identity();

      Map(x => x.MoreNotNullableProperties).Not.Nullable();

      References(x => x.Parent).Column("ParentId").Not.Nullable();
    }
  }

Упрощенные шаги метода обслуживания

Затем у меня есть служебный метод, который извлекает Родитель и добавляет новый Дочерний через какой-то доменный метод. Базовый код NHibernate сводится к следующему:

1) Сессия, открытая в WCF AfterReceiveRequest (IDispatchMessageInspector)

_sessionFactory.OpenSession();

2) Получить существующий экземпляр родительского элемента через .Query

_session.Query<ParentEntity>()
        .Where(item => item.Id == parentId)
        .Fetch(item => item.SomeLookupColumn)
        .First();

3) Добавить новую сущность «Дочерний» в «Родительский» через метод объекта домена, такой как ...

public ChildEntity CreateChild()
{
  var child = new ChildEntity{ Parent = this };

  Children.Add(child);

  return child;
}

4) В конечном итоге вызывает SaveOrUpdate для 'Parent' entity.

 // ChildEntity Id is 0
 _session.SaveOrUpdate(parentEntity)
 // Expect ChildEntity Id to NOT be 0

Примечание: Использование SaveOrUpdate Сохраняет ли изменения в базе данных; использование Merge приводит к TransientObjectException, упомянутому ниже.

5) Наконец, транзакция фиксируется на WCF BeforeSendReply (IDispatchMessageInspector)

 _session.Commit();

Проблема

Обычно, когда объект сохраняется, после вызова SaveOrUpdate, идентификатор указанного объекта отражает Identity, сгенерированный оператором INSERT. Однако, когда я добавляю новую дочернюю сущность к существующей родительской, связанной сущности в Children не назначается идентификатор. Мне нужно передать этот идентификатор обратно вызывающей стороне, чтобы последующие вызовы приводили к ОБНОВЛЕНИЯМ, а не к дополнительным ВСТАВКАМ.

Почему NHibernate не обновляет базовый объект? использование Merge приводит к TransientObjectException, упомянутому ниже.

5) Наконец, транзакция фиксируется на WCF BeforeSendReply (IDispatchMessageInspector)

 _session.Commit();

Проблема

Обычно, когда объект сохраняется, после вызова SaveOrUpdate, идентификатор указанного объекта отражает идентификатор, сгенерированный оператором INSERT. Однако, когда я добавляю новую дочернюю сущность к существующей родительской, связанной сущности в Children не назначается идентификатор. Мне нужно передать этот идентификатор обратно вызывающей стороне, чтобы последующие вызовы приводили к ОБНОВЛЕНИЯМ, а не к дополнительным ВСТАВКАМ.

Почему NHibernate не обновляет базовый объект? использование Merge приводит к TransientObjectException, упомянутому ниже.

5) Наконец, транзакция фиксируется на WCF BeforeSendReply (IDispatchMessageInspector)

 _session.Commit();

Проблема

Обычно, когда объект сохраняется, после вызова SaveOrUpdate, идентификатор указанного объекта отражает Identity, сгенерированный оператором INSERT. Однако, когда я добавляю новую дочернюю сущность к существующей родительской, связанной сущности в Children не назначается идентификатор. Мне нужно передать этот идентификатор обратно вызывающей стороне, чтобы последующие вызовы приводили к ОБНОВЛЕНИЯМ, а не к дополнительным ВСТАВКАМ.

Почему NHibernate не обновляет базовый объект? Id указанного объекта отражает Identity, сгенерированный оператором INSERT. Однако, когда я добавляю новую дочернюю сущность к существующей родительской, связанной сущности в Children не назначается идентификатор. Мне нужно передать этот идентификатор обратно вызывающей стороне, чтобы последующие вызовы приводили к ОБНОВЛЕНИЯМ, а не к дополнительным ВСТАВКАМ.

Почему NHibernate не обновляет базовый объект? Id указанного объекта отражает Identity, сгенерированный оператором INSERT. Однако, когда я добавляю новую дочернюю сущность к существующей родительской, связанной сущности в Children не назначается идентификатор. Мне нужно передать этот идентификатор обратно вызывающей стороне, чтобы последующие вызовы приводили к ОБНОВЛЕНИЯМ, а не к дополнительным ВСТАВКАМ.

Почему NHibernate не обновляет базовый объект? Должен ли я явно вызывать SaveOrUpdate для дочернего элемента (это отстой, если это так)?

Любые мысли по этому поводу приветствуются. Спасибо!

ИЗМЕНИТЬ Я должен отметить, что новая дочерняя сущность сохраняется, как ожидалось; Я просто не могу вернуть присвоенный идентификатор.

ОБНОВЛЕНИЕ Пытался переключиться на .Merge (~), как предложил Майкл Буэн ниже; в результате возникает исключение TransientObjectException, говорящее мне явно сохранить мою измененную дочернюю сущность перед вызовом слияния. Я также экспериментировал с .Persist (~) безрезультатно. Приветствуются любые дополнительные сведения.

объект является несохраненным временным экземпляром - сохраните временный экземпляр перед объединением: My.NameSpace.ChildEntity

10
задан John G 12 April 2011 в 14:32
поделиться