NHibernate插入生成收集项目的更新

Gro*_*roo 0 c# nhibernate insert has-many nhibernate-mapping

我应该如何配置映射以避免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();
    }  
}
Run Code Online (Sandbox Code Playgroud)

让我们Parent有一堆Child对象:

Parent p = new Parent("test");
p.ChildNodes.AddRange(GetSomeDummyNodes());
Run Code Online (Sandbox Code Playgroud)

保存父实体时,生成的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
Run Code Online (Sandbox Code Playgroud)

如果我使用Guid.Comb作为ID列生成器,则没有更新,外键将INSERT立即在语句中设置。但是由于我正在使用该Increment策略(该策略还在客户端创建ID,并且没有可SELECT从数据库读取ID值的语句,所以我不明白为什么无法立即设置ID。

Fre*_*els 5

我认为您必须查看“反向”映射属性。

HasMany(x => x.ChildNodes)
           .Inverse()
           .KeyColumns.Add("Parent_id")
           .Cascade.All();
Run Code Online (Sandbox Code Playgroud)