如何配置我的映射以避免NHibernate在插入后立即更新我的子实体的外键?
E.g。父类映射如下:
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
策略(也在客户端创建ID,并且没有SELECT
语句可以从数据库中读取ID值,我不明白为什么ID不能不要马上设置。
答案 0 :(得分:4)
我认为您必须查看“反向”映射属性。
HasMany(x => x.ChildNodes)
.Inverse()
.KeyColumns.Add("Parent_id")
.Cascade.All();