简体   繁体   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;
}

This code is used after EF6 SaveChanges() exception此代码在EF6 SaveChanges()异常之后使用

My scanrio, I insert some values and delete old one then I get an exception.我的 scanrio,我插入了一些值并删除了旧的值,然后我得到了一个例外。 My data should be preserved because of rollback and web site should work normally.由于回滚,我的数据应该被保留,网站应该可以正常工作。 But I get this exception in "EntityState.Unchanged" in sector "EntityState.Modified:"但是我在“EntityState.Modified”扇区的“EntityState.Unchanged”中得到了这个异常:

Message=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.如果外键不支持空值,则必须定义新关系,必须为外键属性分配另一个非空值,或者必须删除不相关的对象。 Source=EntityFramework来源=实体框架

Why I can not change DB context back to previous state?为什么我不能将数据库上下文更改回以前的状态?

EDIT:编辑:

How I delete dependencies?我如何删除依赖项?

workReport.sepapayments.Remove(sepaPayment);

workReportAccountSettlement.workreports.Remove(workReport);

the data you are trying to remove have dependent child objects and you have foreign key relation ship setup.您尝试删除的数据具有相关的子对象,并且您具有外键关系设置。 therefore you can not delete/add.因此您不能删除/添加。

Have a look on items you are adding and removing and ensure you have valid entities.查看您正在添加和删除的项目,并确保您拥有有效的实体。

I would split your implementation into two我会把你的实现分成两部分

1st第一

delete existing items (ensure the dependent child items are removed before you remove parent or use cascade) - if you are using cascade be careful what are you deleting删除现有项目(确保在删除父项或使用级联之前删除依赖的子项) - 如果您使用级联,请注意您要删除的内容

2nd第二

add new items once deleting works删除作品后添加新项目

Instead of removing the entities from collections而不是从集合中删除实体

workReport.sepapayments.Remove(sepaPayment);

workReportAccountSettlement.workreports.Remove(workReport);

try to delete them尝试删除它们

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

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

Or you can或者你可以

myDBContext.ObjectContext.DeleteObject(sepaPayment);

See also this answer .另请参阅此答案 The reason you get this exception is because FK is non-nullable, the UML association between those entites (classes) is a composition, so you need either completely delete the entity or change the FK of the related entity first.您收到此异常的原因是因为 FK 不可为空,这些实体(类)之间的 UML 关联是一个组合,因此您需要先完全删除实体或更改相关实体的 FK。

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

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