EF Core 7一对一关系,同一张表的两个外键

问题描述 投票:0回答:1

我正在为来自同一张表的 2 个外键的问题而苦苦挣扎:

public class Person
{
    public int PId { get; set; }
    public string Name { get; set; }
    public int? HomeAddressId { get; set; }
    public int? WorkAddressId { get; set; }

    public virtual Address HomeAddress { get; set; }
    public virtual Address WorkAddress { get; set; }
}

public class Address
{
    public int AId { get; set; }
    public string street { get; set; }
    public int? PersonId { get; set; }

    public virtual Person Person { get; set; }
}

这是我的流利配置:

...
builder.Entity<Person>()
       .HasOne(p => p.HomeAddress)
       .WithOne()
       .HasForeignKey<Person>(pl => pl.HomeAddressId)
       .OnDelete(DeleteBehavior.Restrict)
       .IsRequired(false);

builder.Entity<Person>()
       .HasOne(p => p.WorkAddress)
       .WithOne()
       .HasForeignKey<Person>(pl => pl.WorkAddressId)
       .OnDelete(DeleteBehavior.Restrict)
       .IsRequired(false);

builder.Entity<Address>()
       .HasOne(p => p.Person)
       .WithOne()
       .HasForeignKey<Address>(pl => pl.PersonId)
       .OnDelete(DeleteBehavior.Restrict)
       .IsRequired(false);

添加数据工作正常,但是当我从

WorkAddress
实体中删除例如
Person
时,它在
WorkAddressId
列的数据库中设置为 null,但它不会从数据库中删除
Address
(状态 == 未更改) .

问题:如何更改代码以不仅将工作或家庭地址设置为空,还从数据库中删除

Address
行?

提前感谢您的帮助:)

c# entity-framework entity-framework-core ef-code-first
1个回答
0
投票

你应该改变

OnDelete()
行为为
SetNull

builder.Entity<Person>()

....
       .HasForeignKey<Person>(p => p.HomeAddressId)
       .OnDelete(DeleteBehavior.SetNull)
...

builder.Entity<Person>()
...
       .HasForeignKey<Person>(p => p.WorkAddressId)
       .OnDelete(DeleteBehavior.SetNull)
...

builder.Entity<Address>()
...
       .HasForeignKey(a => a.PersonId)
       .OnDelete(DeleteBehavior.Cascade)
...

请注意,

Address
实体的 DeleteBehavior 设置为
Cascade
,这意味着当删除
Person
实体时,所有关联的地址行也将被删除。

并将此添加到您的

Person
实体

public virtual ICollection<Address> Addresses { get; set; }

希望这有帮助:)

© www.soinside.com 2019 - 2024. All rights reserved.