Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/283.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 理解EF 6删除时的异常_C#_Entity Framework - Fatal编程技术网

C# 理解EF 6删除时的异常

C# 理解EF 6删除时的异常,c#,entity-framework,C#,Entity Framework,异常消息: 操作失败:无法更改关系,因为 一个或多个外键属性不可为空。当 对关系进行更改时,相关的外键属性为 设置为空值。如果外键不支持空值, 必须定义新关系,外键属性必须为 指定了另一个非空值,或者必须为不相关的对象 删除 我有一个关于删除的级联。如果我删除数据库中的Foobar,所有的foo也会被删除,所以级联删除是有效的 为什么我从EF 6得到这个异常 编辑: 如果我使用此代码: public int Delete(Foobar item) { using

异常消息:

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

我有一个关于删除的级联。如果我删除数据库中的Foobar,所有的foo也会被删除,所以级联删除是有效的

为什么我从EF 6得到这个异常

编辑:

如果我使用此代码:

    public int Delete(Foobar item)
    {
        using (var ctx = new DataContext())
        {
            ctx.Set<Foobar>().Attach(item);
            ctx.Set<Foobar>().Remove(item);
            return ctx.SaveChanges();
        }
    } 
public int Delete(Foobar项)
{
使用(var ctx=new DataContext())
{
ctx.Set().Attach(项目);
ctx.Set().移除(项目);
返回ctx.SaveChanges();
}
} 

一切都按照我的预期进行。但我想知道原因是什么?

不使用
EntityState
而只是删除实体即可解决此问题:

ctx.Foobars.Remove(item);
如果启用了cascade on delete,则
Remove()
方法也将删除子实体,因为您在定义关系的DbContext上使用它(注意,您还必须在EF中启用它,而不仅仅是数据库!),
EntityState.Deleted
只会在objectContext中将实体的状态标记为已删除,并在调用
SaveChanges()
时尝试删除这一实体。如果实体之间的关系是可选的,这将起作用,那么在将更改保存到数据库时,子实体的外键属性将设置为
null


当您使用分离的实体时,实际上应该只使用
EntityState
,这样您仍然可以对实体进行更改,而不必首先从数据库中获取实体,进行更改,然后再次保存。

此问题将通过不使用
EntityState
而仅删除实体来解决:

ctx.Foobars.Remove(item);
如果启用了cascade on delete,则
Remove()
方法也将删除子实体,因为您在定义关系的DbContext上使用它(注意,您还必须在EF中启用它,而不仅仅是数据库!),
EntityState.Deleted
只会在objectContext中将实体的状态标记为已删除,并在调用
SaveChanges()
时尝试删除这一实体。如果实体之间的关系是可选的,这将起作用,那么在将更改保存到数据库时,子实体的外键属性将设置为
null


当您使用分离的实体时,您实际上应该只使用
EntityState
,这样您仍然可以对实体进行更改,而不必首先从数据库中获取实体,进行更改,然后再次保存它们。

protected override void OnModelCreating(DbModelBuilder modelBuilder){modelBuilder.Entity().HasOptional(a=>a.Foos).WithOptionalDependent().WillCascadeOnDelete(true);}受保护的重写在模型创建(DbModelBuilder modelBuilder){modelBuilder.Entity().HasOptional(a=>a.Foos).WithOptionalDependent().WillCascadeOnDelete(true);}