You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Fluent NHibernate HasMany关联重复插入问题求助

NHibernate 父表重复插入问题解决

问题现象

执行插入操作时,父表CostRegister会根据子表CostDocumentRegister的元素数量重复插入相同记录——子表有多少条元素,父表就被重复插入多少次。

原因分析

  1. 双向关联的两端同时配置了Cascade.SaveUpdate(),导致NHibernate处理父子对象时多次触发父表插入操作。
  2. 父表的HasMany映射未设置Inverse(true),默认由父端维护关联关系,结合子端的关联配置,引发重复插入。

解决方案

修改映射配置

  1. 子表映射(CostDocumentRegisterMap):移除References中的Cascade.SaveUpdate(),级联操作由父表统一控制。
  2. 父表映射(CostRegisterMap):添加Inverse(true),将关联关系的维护权交给子表,避免父端重复触发插入。

修改后的CostDocumentRegisterMap代码

public CostDocumentRegisterMap()
{
    Table("[CostDocumentRegister]");
    Id(x => x.ID, "CostDocumentRegisterID").GeneratedBy.Native();
    Map(x => x.TaxNo, "TaxNo").CustomSqlType("nvarchar(20)").Not.Nullable();
    Map(x => x.VendorCode, "VendorCode").CustomSqlType("nvarchar(20)").Not.Nullable();

    References<CostRegister>(x => x.CostRegister, "CostRegisterID").Not.LazyLoad().Not.Nullable();
}

修改后的CostRegisterMap代码

public CostRegisterMap()
{
    Table("[CostRegister]");
    Id(x => x.ID, "CostRegisterID").GeneratedBy.Native();

    HasMany(x => x.CostDocumentRegister)
        .Table("CostDocumentRegister")
        .KeyColumn("CostRegisterID")
        .Cascade.SaveUpdate()
        .Not.LazyLoad()
        .Inverse(true);
}

正确的保存逻辑

保存时只需操作父对象,由NHibernate自动处理子对象的级联插入,同时确保子对象的CostRegister引用指向父对象:

var costRegister = new CostRegister();
costRegister.CostDocumentRegister = new List<CostDocumentRegister>();

var doc1 = new CostDocumentRegister { TaxNo = "123", VendorCode = "V001", CostRegister = costRegister };
var doc2 = new CostDocumentRegister { TaxNo = "456", VendorCode = "V002", CostRegister = costRegister };

costRegister.CostDocumentRegister.Add(doc1);
costRegister.CostDocumentRegister.Add(doc2);

using (var session = sessionFactory.OpenSession())
using (var transaction = session.BeginTransaction())
{
    session.Save(costRegister);
    transaction.Commit();
}

内容的提问来源于stack exchange,提问作者Rasim Kaptan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 10:22:51