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

时间:2010-11-02 09:51:33

标签: nhibernate fluent-nhibernate

我有以下Fluent Mappings:

    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

1 个答案:

答案 0 :(得分:4)

出现这种情况是因为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,所以现在他知道哪些实体是新的,哪些是旧的。