NHibernate插入生成收集项目的更新 [英] NHibernate insert generates updates for collection items

查看:70
本文介绍了NHibernate插入生成收集项目的更新的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我应该如何配置映射以避免NHibernate在插入子实体后立即更新我的子实体的外键?

How should I configure my mappings to avoid NHibernate updating my child entities' foreign keys right after inserting them?

例如父类的映射如下:

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如下所示:

When I save the parent entity, generated SQL looks like this:

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立即.

If I use Guid.Comb as Id column generator, there are no updates, foreign keys are set in INSERT statements immediately. But since I am using the Increment strategy (which also creates IDs on the client side, and there is no SELECT statement which would read the ID value from the database, I don't see why IDs couldn't be set immediately.

推荐答案

我认为您必须看看'Inverse'映射属性.

I think you'll have to take a look at the 'Inverse' mapping attribute.

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

这篇关于NHibernate插入生成收集项目的更新的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆