在使用EF Core时,我一直在努力解决以下问题:
一个特定的实体,我们称之为Person,与它自身有很多对多关系[Person的实例可能包含其他Person实例的列表]。 体现这种多对多关系的连接实体,称之为PersonPerson,已经配置了OnDelete(DeleteBehaviour.Restrict), 为了打破循环引用/级联删除。但这似乎阻碍了这些PersonPerson实例的正常删除。
错误是
InvalidOperationException:实体类型之间的关联' Person'和#PersonPerson'已被切断,但外国的关键 关系不能设置为null。如果应删除依赖实体,则将关系设置为使用级联删除。
这是一个问题22,还是我没有正确删除?
public class Person
{
public int Id { get; set; }
-some person properties-
public ICollection<PersonPerson> Parents { get; set; }
public ICollection<PersonPerson> Children { get; set; }
}
public class PersonPerson
{
[Required]
public int PersonParentId { get; set; }
[Required]
public int PersonChildId { get; set; }
public Person Parent { get; set; }
public Person Child { get; set; }
}
protected override void OnModelCreating(ModelBuilder builder)
{
base.OnModelCreating(builder);
...
builder.Entity<PersonPerson>()
.HasKey(i => new { i.PersonParentId, i.PersonChildId });
builder.Entity<PersonPerson>()
.HasOne(i => i.Parent)
.WithMany(i => i.Children)
.HasForeignKey(i => i.ParentParentId)
.OnDelete(DeleteBehavior.Restrict);
builder.Entity<PersonPerson>()
.HasOne(i => i.Child)
.WithMany(i => i.Parents)
.HasForeignKey(i => i.PersonChildId)
.OnDelete(DeleteBehavior.Restrict);
...
在控制器中,有:
Person person;
PersonPerson instanceToRemove;
...
person.Children.Remove(instanceToRemove);
...
_context.Update(person);
await _context.SaveChangesAsync();