Fluent NHibernate HasMany关联重复插入问题求助
NHibernate 父表重复插入问题解决
问题现象
执行插入操作时,父表CostRegister会根据子表CostDocumentRegister的元素数量重复插入相同记录——子表有多少条元素,父表就被重复插入多少次。
原因分析
- 双向关联的两端同时配置了
Cascade.SaveUpdate(),导致NHibernate处理父子对象时多次触发父表插入操作。 - 父表的
HasMany映射未设置Inverse(true),默认由父端维护关联关系,结合子端的关联配置,引发重复插入。
解决方案
修改映射配置
- 子表映射(CostDocumentRegisterMap):移除
References中的Cascade.SaveUpdate(),级联操作由父表统一控制。 - 父表映射(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
相关产品推荐
相关产品推荐

