gpt4 book ai didi

NHibernate 级联集合在将新项目插入非空集合时删除

转载 作者:行者123 更新时间:2023-12-03 22:30:47 25 4
gpt4 key购买 nike

我有以下 Fluent 映射:

    public ScanDeliverySessionMap()
{
Id(x => x.Id);
...
...
HasManyToMany(x => x.ToScanForms) <--- IList<Form> ToScanForms --->
.Table("ToScanForm")
.ParentKeyColumn("SessionId")
.ChildKeyColumn("FormId").Cascade.SaveUpdate();
}

public FormMap()
{

Id(x => x.Id).Column("FormID").GeneratedBy.Foreign("Log");

....
....

HasManyToMany(x => x.ScanDeliverySessions)
.Table("ToScanForm")
.ParentKeyColumn("FormId")
.ChildKeyColumn("SessionId").Inverse();
}

当我尝试将新表单插入 ToScanForms 集合时一切似乎都正常,但在 NHProf 上观看我看到 NH casacde DELETE 覆盖了所有 ToScanForms 项目然后 NH INSERT ToScanForms 项目,包括新项目。

部分截图: alt text alt text

最佳答案

出现该行为是因为 nhibernate 不知道集合中的哪些实体是新的哪些是旧的,因此他必须删除所有内容然后重新插入它们。

要防止这种行为非常简单:将您的属性更改为 ICollection 并将您的 HasManyToMany 映射为一个集合。您的映射将更改为以下内容:

public ScanDeliverySessionMap()
{
Id(x => x.Id);
...
...
HasManyToMany(x => x.ToScanForms) //<--- ICollection<Form> ToScanForms --->
.AsSet()
.Table("ToScanForm")
.ParentKeyColumn("SessionId")
.ChildKeyColumn("FormId").Cascade.SaveUpdate();
}

public FormMap()
{

Id(x => x.Id).Column("FormID").GeneratedBy.Foreign("Log");

....
....

HasManyToMany(x => x.ScanDeliverySessions)
.AsSet()
.Table("ToScanForm")
.ParentKeyColumn("FormId")
.ChildKeyColumn("SessionId").Inverse();
}

在底层 nhibernate 将使用 Iesi Collections 的 HashSet,所以现在他知道哪些实体是新的,哪些是旧的。

关于NHibernate 级联集合在将新项目插入非空集合时删除,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4076502/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com