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
设置为空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
;