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

标签 nhibernate fluent-nhibernate

我有以下 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/

相关文章:

c# - NHibernate 批量插入或更新

c# - nHibernate - 定义类(和表)时何时使用对象

.net - Nhibernate 过滤器不能一致地应用于子集合

NHibernate.Validator : when saving entity, 我的自定义消息不可用,如何获取它们?

fluent-nhibernate - 如何在 Fluent Nhibernate 中对名称不匹配的两个非键属性创建连接?

c# - 如何使用 PostSharp AOP 获取当前 NHibernate session 以使用 Transaction 属性?

c# - Nhibernate 使用 Fluent 禁用二级缓存 - 也禁用假缓存

visual-studio - 生成(一)发布可执行文件

nhibernate - 具有不可为空键列的 HasMany 映射

c# - 具有固定值的多对一缺失列