繁体   English   中英

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

[英]C# EF6 Rollback changes, EntityState.Unchanged error

// 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.Modified”扇区的“EntityState.Unchanged”中得到了这个异常:

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

为什么我不能将数据库上下文更改回以前的状态?

编辑:

我如何删除依赖项?

workReport.sepapayments.Remove(sepaPayment);

workReportAccountSettlement.workreports.Remove(workReport);

您尝试删除的数据具有相关的子对象,并且您具有外键关系设置。 因此您不能删除/添加。

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

我会把你的实现分成两部分

第一

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

第二

删除作品后添加新项目

而不是从集合中删除实体

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);

另请参阅此答案 您收到此异常的原因是因为 FK 不可为空,这些实体(类)之间的 UML 关联是一个组合,因此您需要先完全删除实体或更改相关实体的 FK。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM