我在自引用表中有一个一对多关系。从数据库中删除父行后,我希望将子行保留在表中。
不幸的是,当我试图删除一个家长时,我得到的是:
DELETE语句与SAME TABLE REFERENCE冲突约束"FK_Librares_Libraries_TemplateId"。冲突发生了在数据库"xxx"的表"dbo.Libraries"的列"TemplateId"中。
这是我的配置:
public class Library
{
public int Id { get; set; }
public int? TemplateId { get; set; }
public virtual Library Template { get; set; }
public virtual ICollection<Library> Libraries { get; set; }
}
以下是我尝试为行为建模的方法:
builder.HasMany(library => library.Libraries).WithOne(library => library.Template)
.HasForeignKey(library => library.TemplateId).IsRequired(false).OnDelete(DeleteBehavior.Restrict);
我认为在删除父级之前,应该将子级的TemplateId设置为null。
parent.Libraries.Clear();
context.SaveChanges();
应该删除关系。然后可以删除父对象。孩子们不会被删除。
原因:TemplateId是指向库的外键。它加强了一致性。它不允许TemplateId指向不存在的库(父级(。因此,在删除父对象之前,必须先解除子对象与父对象的关联。