Я явно что-то упускаю (надеюсь, очевидно), и мне пока не повезло с 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