【问题标题】:Cascade Delete EF Core and Cross Tables级联删除 EF Core 和交叉表
【发布时间】:2018-08-29 21:02:52
【问题描述】:

我有一个地址模型,它用于我系统中的所有模型,如下所示:

class Person
{
    public IList<PersonAddress> PersonAddresses { get; set; }

    public Person()
    {
        PersonAddresses = new List<PersonAddress>();
    }
}

class PersonAddress
{
    public int PersonId { get; set; }
    public Person Person { get; set; }

    public int AddressId { get; set; }
    public Address Address { get; set; }
}

class Address 
{
   //...
}

在 OnModelCreating 中:

builder.Entity<PersonAddress>()
            .HasKey(pa => new { pa.PersonId, pa.AddressId });

它的工作非常好!我唯一的问题是关于级联删除。我如何设置这个场景:

  • 删除人员时,级联删除人员地址和地址
  • 删除地址时,级联删除 PersonAddress 而不是 Person

目前我看到删除 Person 会删除 PersonAddress(但不会删除相关的地址)。

我没有抱怨这种行为,但我不清楚如何设置自动级联删除我想要的实体,或者我是否需要手动执行删除。

感谢您的宝贵时间!

【问题讨论】:

  • 删除人员时确定要删除地址吗?那个地址不能有多个人吗?如果没有,则不需要创建多对多关系。
  • @Tim 我理解你,但有 1 个人有 N 个地址,我还有其他与 Address 相关的实体。例如,Customer、CustomerAddress、Vendor、VendorAddress 等...所有实体共享同一个 Address 实体。
  • 但不能CustomerPersonVendor 都只有List&lt;Address&gt;
  • @Tim 然后 EF Core 将为每个表创建一个表,例如 CustomerAddress、PersonAddress 和 VendorAddress。我只希望一个表“地址”中的所有地址
  • 有一些方法可以解决这个问题,例如将PersonId 替换为Address 类中的通用EntityId,并映射到每种不同类型的用户实体。

标签: c# .net database entity-framework-core


【解决方案1】:

WillCascadeOnDelete(true)WillCascadeOnDelete(false) 扩展与fluent api 一起使用。

builder.Entity<PersonAddress>()
            .HasKey(pa => new { pa.PersonId, pa.AddressId })
            .WillCascadeOnDelete(true);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-19
    • 1970-01-01
    • 2021-04-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多