Fluent API中对于一个表的关系级联删除问题

4
我有以下配置。我有一个用户。该用户有一个邮寄地址和一个实际地址(见下文)。
public class UserProfile
{
    public Guid UserProfileId {get; set;}

    public Guid PostalAddressId {get;set;}
    public virtual Address PostalAddress {get;set;}

    public Guid PhysicalAddressId {get;set;}
    public virtual Address PhysicalAddress {get;set;}
}

public class Address{
    public Guid AddressId {get;set;}
    public string LineOne {get;set;}
    public string LineTwo {get;set;}
    public string LineThree {get;set;}
}

接下来是我的流畅映射。

public UserProfileMapping()
{
    ToTable("UserProfile");
    HasKey(pk => pk.UserProfileId);
    Property(pr => pr.UserProfileId).HasDatabaseGeneratedOption(DatabaseGeneratedOption.None);

    HasRequired(a => a.PostalAddress).WithMany().HasForeignKey(fk => fk.PostalAddressId);
    HasRequired(a => a.PhysicalAddress).WithMany().HasForeignKey(fk => fk.PhysicalAddressId);
}

public AddressMapping()
{
    ToTable("Address");
    HasKey(pk => pk.AddressId);
    Property(pr => pr.AddressId).HasDatabaseGeneratedOption(DatabaseGeneratedOption.None);
}

当我尝试运行update-database时出现以下错误: 引入外键约束“FK_dbo.UserProfile_dbo.Address_PhysicalAddressId”在表“UserProfile”上可能会导致循环或多个级联路径。指定ON DELETE NO ACTION或ON UPDATE NO ACTION, 或修改其他FOREIGN KEY限制。
我的要求是在Address对象上没有任何反向映射,我还需要能够硬删除UserProfile对象,包括其子地址(地址表中只有两个地址)。
我的问题是,我想要的这个功能是否可能?如果是,请问我做错了什么?
[编辑] Address对象还用于UserCompany和Customer等对象中。
1个回答

0

由于地址不是UserProfile的子项,而只是关联关系,因此您不希望使用级联删除:

HasRequired(a => a.PostalAdress)
    .WithMany()
    .HasForeignKey(fk => fk.PostalAddressId)
    .WillCascadeDelete(false);

抱歉,我没有提供足够的信息。Address对象可以属于不止一个UserProfile。公司对象也可以有地址,客户也可以有地址。据我了解,使用您建议的答案可能行不通,因为这是一对一映射。我可以更新我的问题以反映这一点。 - Skbenga
如果地址可以链接到其他对象,您如何删除包括其子地址的用户配置文件? - Kinetic
如果地址不属于用户个人资料,您不希望进行级联删除。 - Kinetic
一个地址要么属于客户,要么属于用户或公司。经过一番思考,我认为我设计表格的方式是错误的。最初,我打算拥有UserPhysicalAddress、UserPostalAddress、CompanyAddress和CustomerAddress,但由于它们都具有相同的模型结构,我决定制作一个单一的Address模型。然而,实施这个想法已经成为了一个头疼的问题。 - Skbenga

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接