我正在为来自同一张表的 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
行?
提前感谢您的帮助:)
你应该改变
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; }
希望这有帮助:)