Вставка NHibernate создает обновления для элементов коллекции
Как мне настроить сопоставления, чтобы NHibernate не обновлял внешние ключи моих дочерних сущностей сразу после их вставки?
Например, родительский класс отображается так:
class ParentMap : ClassMap<Parent>
{
public ParentMap()
{
Id(x => x.Id)
.GeneratedBy.Increment();
Map(x => x.Name);
HasMany(x => x.ChildNodes)
.KeyColumns.Add("Parent_id")
.Cascade.All();
}
}
Позволять Parent
есть куча Child
объекты:
Parent p = new Parent("test");
p.ChildNodes.AddRange(GetSomeDummyNodes());
Когда я сохраняю родительский объект, сгенерированный SQL выглядит так:
INSERT INTO [Parent] (Name, Id) VALUES (@p0, @p1); @p0 = 'test', @p1 = 0
INSERT INTO [Child] (Name, Id) VALUES (@p0); @p0 = 'child1', @p1 = 0
INSERT INTO [Child] (Name, Id) VALUES (@p0); @p0 = 'child2', @p1 = 1
INSERT INTO [Child] (Name, Id) VALUES (@p0); @p0 = 'child3', @p1 = 2
UPDATE [Child] SET Parent_id = @p0 WHERE Id = @p1; @p0 = 0, @p1 = 0
UPDATE [Child] SET Parent_id = @p0 WHERE Id = @p1; @p0 = 1, @p1 = 0
UPDATE [Child] SET Parent_id = @p0 WHERE Id = @p1; @p0 = 2, @p1 = 0
Если я использую Guid.Comb в качестве генератора столбцов Id, обновлений нет, внешние ключи устанавливаются в INSERT
заявления сразу. Но так как я использую Increment
стратегия (которая также создает идентификаторы на стороне клиента, и нет SELECT
оператор, который будет читать значение идентификатора из базы данных, я не понимаю, почему идентификаторы не могут быть установлены сразу.
1 ответ
Решение
Я думаю, вам нужно взглянуть на атрибут отображения "Inverse".
HasMany(x => x.ChildNodes)
.Inverse()
.KeyColumns.Add("Parent_id")
.Cascade.All();