C# 4.0 尽管配置正确,实体框架5级联删除仍不工作

C# 4.0 尽管配置正确,实体框架5级联删除仍不工作,c#-4.0,entity-framework-5,C# 4.0,Entity Framework 5,在父级>子级关系中有两个表 尝试删除父项时,我收到以下错误: The operation failed: The relationship could not be changed because one or more of the foreign-key properties is non-nullable. When a change is made to a relationship, the related foreign-key property is set to a null v

在父级>子级关系中有两个表

尝试删除父项时,我收到以下错误:

The operation failed: The relationship could not be changed because one or more of the foreign-key properties is non-nullable. When a change is made to a relationship, the related foreign-key property is set to a null value. If the foreign-key does not support null values, a new relationship must be defined, the foreign-key property must be assigned another non-null value, or the unrelated object must be deleted.
我在dbfirst类型模型中使用SQL Server 2012

在数据库中,delete规则设置为cascade,我在.edmx中再次检查了该规则是否也设置为cascade

我使用的是执行多个事务,然后在最后调用.SaveChanges(),不确定这是否与此有关。具体来说,我首先在另一个表上发布一个更新,然后是这个删除

以下是用于删除的常用存储库代码:

public virtual ActionConfirmation<int> Delete(TRepository entity, bool boolCommitChgs = true)
        {

            try
            {   
                //DbSet.Remove(entity);
                _dataContext.Entry(entity).State = System.Data.EntityState.Deleted;
                if (boolCommitChgs)
                {
                    _dataContext.SaveChanges();
                }

                return CRUDMessage(true, "deleted", entity);
            }
            catch (Exception ex)
            {
                return CRUDMessage(false, "delete", entity, ex);
            }
        }
公共虚拟操作确认删除(TRepository实体,bool boolCommitChgs=true) { 尝试 { //删除(实体); _dataContext.Entry(entity).State=System.Data.EntityState.Deleted; 如果(boolCommitChgs) { _dataContext.SaveChanges(); } 返回CRUDMessage(true,“已删除”,实体); } 捕获(例外情况除外) { 返回CRUDMessage(false,“delete”,entity,ex); } } 然后我在这里完成事务并调用SaveChanges,也就是抛出错误时:

try
        {
            dbContext.SaveChanges();
            result = ActionConfirmation<int>.CreateSuccessConfirmation(
                            string.Format("{0} {1}: {2} successful.",
                            strNoun,
                            id, 
                            strVerb
                        ),
                            id
                        );
        }
        catch (Exception ex)
        {
          ....etc....
试试看
{
dbContext.SaveChanges();
结果=ActionConfirmation.CreateSuccessConfirmation(
格式(“{0}{1}:{2}成功。”,
斯特农,
身份证件
服务器
),
身份证件
);
}
捕获(例外情况除外)
{
等
知道我为什么会犯这个错误吗


这个问题可能是由于您的更新更改了一些关系造成的。

啊…有点接近于缩小范围…id确实与在同一事务中对多个更新进行分组有关。如果我只是发出一个删除父项的命令,然后直接调用SaveChanges,它就会起作用…因此出于某种原因,您无法在另一个表上执行更新,并且然后对这个不相关的表执行删除操作???这个问题可能是由于您的更新更改了一些关系造成的。感谢Ladislav的建议…但我不认为是这样。如果我尝试更改两个没有关系但使用相同上下文的表,则会出现错误。如果我为每个选项卡使用上下文的新实例le modification,它可以工作。因此,也许我不理解DbContext,但我认为您可以在同一DbContext实例中更新表X,然后删除表Y,而不会出现问题。同样,表X和表Y之间绝对没有关系……困惑:(啊,你是对的@Ladislav。我首先读取一个表以确定要在一秒钟内删除哪些条目…因为这两个表彼此没有依赖关系,我不理解为什么会出现问题…但是…然后我试图返回并删除表中第一个表的父行。这就是导致错误的原因,我相信,因为上下文已经在跟踪这些子行。所以我猜您可以先分离这些实体,然后继续父记录删除。但现在,我只使用一个上下文读取另一个上下文删除。Ladislav,如果您将您的评论作为答案,我将接受它作为答案。