我在实体框架6中存在级联删除的大问题。我有一个简单的数据库,只有2个表,人员和地址,每个人可以有0个或多个地址 - > 1:n关系。
当我删除某人时,所有地址也会被删除 - >大!
但是当我尝试删除一个人的所有地址时,我得到一个例外:
操作失败:无法更改关系,因为一个或多个外键属性不可为空。当对关系进行更改时,相关的外键属性将设置为空值。如果外键不支持空值,则必须定义新关系,必须为外键属性分配另一个非空值,或者必须删除不相关的对象。
我在互联网上搜索过去2天,我发现唯一可行的方法是创建一个组合的主键,但这对我来说也不起作用。
我写了一个简短的演示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();
答案 0 :(得分:1)
如果您使用.Clear()
或.Remove()
,您正在孤立地址对象,而不是删除它。在您的地址表中,您可能有一个必需的列来存储person-id。 person-id设置为null或0,可能不是有效值。
您必须实际删除地址。如果没有人,您的地址就不可能存在,这就是您在不删除记录时使用.Clear()
或.Remove()
时要强制执行的操作。