EF Core具有多对多循环引用关系,禁止删除

时间:2016-10-29 09:51:30

标签: asp.net-core entity-framework-core

在使用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();

0 个答案:

没有答案