【问题标题】:C# EF6 Rollback changes, EntityState.Unchanged errorC# EF6 回滚更改,EntityState.Unchanged 错误
【发布时间】:2016-05-05 07:58:45
【问题描述】:
// 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()异常后使用

我的扫描仪,我插入一些值并删除旧值,然后我得到一个异常。由于回滚,我的数据应该被保留,并且网站应该可以正常工作。但是我在“EntityState.Modified:”扇区的“EntityState.Unchanged”中得到了这个异常

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

为什么我无法将数据库上下文更改回之前的状态?

编辑:

如何删除依赖项?

workReport.sepapayments.Remove(sepaPayment);

workReportAccountSettlement.workreports.Remove(workReport);

【问题讨论】:

  • 如果您需要撤消给定 DBContext 中的更改,您需要以某种方式记住实体的先前值。但除非您使用 SaveChanges() 更改数据库中的数据,否则您可以处理 DBContext 并从数据库值创建一个新的 DBContext。
  • 我不能这么简单地处理它。我使用 Ioc.var context = unitOfWork.Context 作为 DbContext;

标签: c# sql-server entity-framework


【解决方案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 是不可为空的,这些实体(类)之间的 UML 关联是一个组合,因此您需要完全删除实体或先更改相关实体的 FK。

【讨论】:

    【解决方案2】:

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

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

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

    第一个

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

    第二个

    删除作品后添加新项目

    【讨论】:

    • 我可以做到,但这里的第一个问题是我无法回滚我的数据。我更新了我如何删除依赖项的问题
    猜你喜欢
    • 2021-04-19
    • 1970-01-01
    • 1970-01-01
    • 2010-09-07
    • 2011-03-22
    • 1970-01-01
    • 2014-01-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多