2016-05-05 4 views
2
// 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() исключенияC# EF6 Откат изменений, EntityState.Unchanged ошибка

Мой scanrio, вставить некоторые значения и удалять старую, то я получаю исключение. Мои данные должны быть сохранены из-за отката, и веб-сайт должен работать нормально. Но я получаю это исключение в «EntityState.Unchanged» в секторе «EntityState.Modified:»

Message = Сбой операции: Отношения не могут быть изменены поскольку один или несколько из внешних ключевых свойств не является -nullable. При изменении отношения к связанному свойству внешнего ключа установлено значение null. Если внешний ключ не поддерживает нулевые значения , необходимо определить новое отношение, для свойства внешнего ключа должно быть назначено другое ненулевое значение, или связанный с ним объект должен быть удален. Source = EntityFramework

Почему я не могу изменить контекст БД обратно в предыдущее состояние?

EDIT:

Как я могу удалить зависимости?

workReport.sepapayments.Remove(sepaPayment); 

workReportAccountSettlement.workreports.Remove(workReport); 
+0

Необходимо помнить, что предыдущие значения вашего имени так или иначе связаны, если вам нужно отменить изменения в данном DBC-тексте. Но если вы не измените данные в базе данных с помощью 'SaveChanges()', вы можете удалить DBC-текст и создать новый DBC-текст из значений базы данных. –

+0

Я не могу так просто распоряжаться им. Я использую Ioc.var context = unitOfWork.Context как DbContext; – senzacionale

ответ

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 не имеет значения NULL, ассоциация UML между этими entites (classes) является композицией, поэтому вам нужно либо полностью удалить объект, либо сначала изменить FK связанного объекта.

1

Данные, которые вы пытаетесь удалить, имеют дочерние объекты-зависимые объекты, и у вас есть настройка отношения внешних ключей. поэтому вы не можете удалить/добавить.

Посмотрите на предметы, которые вы добавляете и удаляете, и убедитесь, что у вас есть действительные объекты.

Я бы разделить свою реализацию в два

первого

удалить существующие элементы (убедитесь, что зависимый ребенок элементы удаляются, прежде чем удалить родительский или использовать каскад) - если вы используете каскад быть осторожными, какими вы удалите

второй

добавить новые элементы после удаляющие работы

+0

Что я могу сделать, но первая проблема здесь в том, что я не могу откатить свои данные. Я обновил свой вопрос, как я удаляю зависимости – senzacionale

Смежные вопросы