C#EF6回滚更改,EntityState.Unchanged错误

时间:2016-05-05 07:58:45

标签: c# sql-server entity-framework

// Rollback changes

switch (entry.State)
{
    case EntityState.Added:
        entry.State = EntityState.Detached;
        break;
    case EntityState.Modified:
        entry.CurrentValues.SetValues(entry.OriginalValues);
        entry.State = EntityState.Unchanged;
        break;
    case EntityState.Deleted:
        entry.State = EntityState.Unchanged;
        break;
}

此代码在EF6 SaveChanges()例外

之后使用

我的scanrio,我插入一些值并删除旧值然后我得到一个例外。我的数据应该保留,因为回滚和网站应该正常工作。但是我在" EntityState.Unchanged"中得到了这个例外。在扇区" EntityState.Modified:"

  

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

为什么我无法将DB上下文更改回以前的状态?

编辑:

我如何删除依赖项?

workReport.sepapayments.Remove(sepaPayment);

workReportAccountSettlement.workreports.Remove(workReport);

2 个答案:

答案 0 :(得分:1)

您要删除的数据具有相关的子对象,并且您具有外键关系设置。因此你无法删除/添加。

查看您要添加和删除的项目,并确保您拥有有效的实体。

我会将您的实施分成两个

第一

删除现有项目(确保在删除父级或使用级联之前删除相关子项目)   - 如果您使用级联,请注意删除的内容

第二

删除作品后添加新项目

答案 1 :(得分:1)

而不是从集合中删除实体

workReport.sepapayments.Remove(sepaPayment);

workReportAccountSettlement.workreports.Remove(workReport);

尝试删除它们

myDBContext.Entry(sepaPayment).State = System.Data.Entity.EntityState.Deleted;  

myDBContext.Entry(workReport).State = System.Data.Entity.EntityState.Deleted;  

或者你可以

myDBContext.ObjectContext.DeleteObject(sepaPayment);

See also this answer。您获得此异常的原因是因为FK不可为空,这些entites(类)之间的UML关联是一个组合,因此您需要先完全删除实体或更改相关实体的FK。