【问题标题】:Fluent api Cascade delete on relationships to one tableFluent api Cascade delete 与一张表的关系
【发布时间】:2016-11-21 12:32:35
【问题描述】:

我有以下配置。我有一个用户。用户有一个邮政地址和一个物理地址(见下文)。

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);
}

当我尝试运行更新数据库时,我得到:

引入 FOREIGN KEY 约束 表上的“FK_dbo.UserProfile_dbo.Address_PhysicalAddressId” 'UserProfile' 可能会导致循环或多个级联路径。指定开 DELETE NO ACTION 或 ON UPDATE NO ACTION,或修改其他 FOREIGN KEY 约束。

我需要在 Address 对象上没有任何反向映射。 我还需要能够硬删除 UserProfile 对象,包括其子地址(地址表中只有两个)。

我的问题是,我想要的可能吗?如果是这样,我做错了什么?

[编辑] Address 对象也用于 UserCompany 和 Customer 等对象中。

【问题讨论】:

    标签: c# ef-fluent-api


    【解决方案1】:

    因为地址不是UserProfile的孩子,只是关联,你不想使用级联删除:

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

    【讨论】:

    • 对不起,我没有提供足够的信息。 Address 对象不仅仅属于 UserProfile。公司对象也可以有地址,客户也可以有地址。据我了解,这将无法使用您建议的答案,因为一对一映射。我可以更新我的问题以反映这一点。
    • 如果地址可以链接到其他对象,您如何删除包含其子地址的用户配置文件?
    • 如果地址不属于 UserProfile,您不希望级联删除。
    • 所以地址要么属于客户,要么属于用户或公司。在考虑了这一点之后,我认为我设计了错误的表格。最初我打算拥有 UserPhysicalAddress、UserPostalAddress、CompanyAddress 和 CustomerAddress,但因为它们都有相同的模型结构,我决定制作一个 Address 模型。实现这一点已成为一个令人头疼的问题。
    猜你喜欢
    • 2018-12-01
    • 1970-01-01
    • 2023-04-04
    • 1970-01-01
    • 2013-01-26
    • 2019-01-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多