实体框架级联删除

本文关键字:删除 级联 框架 实体 | 更新日期: 2023-09-27 18:27:44

我在实体框架6中遇到了级联删除的大问题。我有一个简单的数据库,只有2个表,人员和地址,每个人可以有0个或多个地址->1:n关系。

当我删除一个人时,所有地址也会被删除->太棒了!

但当我试图删除一个人的所有地址时,我会得到一个例外:

操作失败:由于一个或多个外键属性不可为null,因此无法更改关系。当对关系进行更改时,相关的外键属性将设置为null值。如果外键不支持null值,则必须定义新的关系,必须为外键属性分配另一个非null值,或者必须删除不相关的对象。

在过去的两天里,我一直在互联网上搜索,我发现唯一应该工作的就是创建一个组合主键,但这对我来说也不起作用。

我写了一个简短的演示http://1drv.ms/1uKQTiR这说明了发生了什么。也许任何人都可以看一看,并给我一些好的建议!

这是代码:

public class Person
{
    public int Id { get; set; }
    public string Name { get; set; }
    public List<Address> Addresses { get; set; }
    public Person()
    {
        Addresses = new List<Address>();
    }
}
public class Address
{
    public int Id { get; set; }
    public string City { get; set; }
    public Person Person { get; set; }
    public Address()
    {
    }
}
 public class Context:DbContext
{
    public DbSet<Person> Persons    { get; set; }
    public DbSet<Address> Addresses { get; set; }
    public Context(): base(@"server=.'SQLEXPRESS;Database=Pers;Trusted_Connection=True;")
    {
        this.Configuration.LazyLoadingEnabled = false;
        this.Configuration.ProxyCreationEnabled = false;
    }
    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Person>().HasMany(p => p.Addresses).WithRequired(p => p.Person).WillCascadeOnDelete(true);

        base.OnModelCreating(modelBuilder);
    }
}

要删除的代码:

        Person p = _ctx.Persons.Include(x => x.Addresses).FirstOrDefault();
        p.Addresses.Clear();
        _ctx.SaveChanges();

实体框架级联删除

如果您使用.Clear().Remove(),您正在对Address对象进行变形,而不是删除它。在Address表中,您可能有一个必需的列来存储person-id。人员id设置为null或0,这可能不是一个有效值。

你必须删除地址。没有人,你的地址就不可能存在,而这正是你在使用.Clear().Remove()而不删除记录时试图强制执行的。