Вставка NHibernate создает обновления для элементов коллекции - PullRequest
0 голосов
/ 26 ноября 2010

Как мне настроить сопоставления, чтобы 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 Ответ

4 голосов
/ 26 ноября 2010

Думаю, вам нужно взглянуть на атрибут отображения 'Inverse'.

HasMany(x => x.ChildNodes)
           .Inverse()
           .KeyColumns.Add("Parent_id")
           .Cascade.All();
...