Asp.net mvc 更新子项而不是删除它

Asp.net mvc 更新子项而不是删除它,asp.net-mvc,nhibernate,fluent-nhibernate,nhibernate-mapping,Asp.net Mvc,Nhibernate,Fluent Nhibernate,Nhibernate Mapping,看看实体- class Person { int id { get; set; }; IList<PersonAddress> Addresses { set; get; } ... } 这是用于PersonalAddress映射: public class PersonAddressMappingOverride : IAutoMappingOverride<PersonAddress> { public void Override(Auto

看看实体-

class Person
{
   int id { get; set; };
   IList<PersonAddress> Addresses { set; get; }
   ...
}
这是用于
PersonalAddress
映射:

public class PersonAddressMappingOverride : IAutoMappingOverride<PersonAddress>
{
    public void Override(AutoMapping<PersonAddress> mapping)
    {
        mapping.Schema(Schemas.Common);
        mapping.Table("PersonAddress");
        mapping.References(x => x.Person);
        mapping.References(x => x.Address).Cascade.SaveUpdate().Not.Nullable();
        mapping.References(x => x.AddressType).Not.Nullable();
    }
}
公共类PersonalAddressAppingOverride:IAAutoMappingOverride
{
公共无效替代(自动映射)
{
Schema(Schemas.Common);
映射表(“PersonalAddress”);
mapping.References(x=>x.Person);
mapping.References(x=>x.Address).Cascade.SaveUpdate().Not.Nullable();
mapping.References(x=>x.AddressType).Not.Nullable();
}
}
编辑:下面添加了fluent映射

让我们假设使用
的映射如下所示:

<bag name="address" >
    <key column="PersonId" />
    <one-to-many class="Address"/>
</bag>
在这种情况下,我们不仅关心关系,甚至还关心集合中的项目。查看此映射以了解更多详细信息:(小摘录):

(6) 级联(可选-默认为无)允许操作级联到子实体

现在,当我们从集合中删除address实例时,它也将从持久性中删除。但是,实现这一目标的步骤将是:

  • 更新地址并将
    PersonId
    设置为空
  • 删除地址
  • 为了避免这种情况,我们可以添加另一个映射特性:反向映射。因此,在这种情况下,该地址具有到Person的映射(多对一),我们可以使用此映射(请参见
    inverse=“true”
    ):


    这是一个映射问题,因此请同时发布映射ta.mapping.HasMany(x=>x.Addresses).ForeignKeyConstraintName(“FK_PersonalAddress_PersonalId”)。其中(“DeletedDate为null”).Cascade.AllDeleteOrven().Cascade.SaveUpdate();这是Person类的映射文件,看起来它已经在使用Cascade.AllDeleteOrphan(),而Address类的映射是-mapping.Schema(Schemas.Common);映射表(“PersonalAddress”);mapping.References(x=>x.Person);mapping.References(x=>x.Address).Cascade.SaveUpdate().Not.Nullable();mapping.References(x=>x.AddressType).Not.Nullable();我想这是一个包映射?你能不能不只是为个人粘贴整个映射类?谢谢Ramdim的回答,我会检查它并让你知道!我可以看到,我已经为cascad使用了“全部删除孤立项”选项。正如我在您的问题下方的评论中所看到的,问题可能在于不正确的cascade映射。您正在对个人地址集合映射使用级联:
    Cascade.AllDeleteOrphan().Cascade.SaveUpdate()SaveUpdate()
    ,只留下
    Cascade.AllDeleteOrphan()
    。现在一切都应按预期进行。我删除了.Cascade.SaveUpdate(),但仍然使用设置personId=NULL的更新地址。我已使用您需要的映射更新了我的答案。因为直到现在,看到insertion PersonId=NULL是正确的,因为我们缺少
    Inverse()
    映射。将其附加到HasMany映射,NHibernate将能够级联删除。。。以相反的顺序。它将只调用“删除地址”
    <bag name="address" >
        <key column="PersonId" />
        <one-to-many class="Address"/>
    </bag>
    
    <bag name="address" cascade="all-delete-orphan"
        <key column="PersonId" />
        <one-to-many class="Address"/>
    </bag>
    
    <bag name="address" cascade="all-delete-orphan" inverse="true">
        <key column="PersonId" />
        <one-to-many class="Address"/>
    </bag>
    
    ...
    mapping.HasMany(x => x.Addresses)
        .ForeignKeyConstraintName("FK_PersonAddress_Person_PersonID")
        .Where("DeletedDate is null")
        .Inverse() // this will cause the direct DELETE to be issued
        .Cascade.AllDeleteOrphan() // this is the only Cascade which should be used
        ;