Сохранение изменений в Entity Framework ошибка оператора вставки внешнего ключа

#c# #entity-framework

#c# #entity-framework

Вопрос:

У меня есть объект property, и я хотел удалить его из последней коллекции репозитория. Или я могу сказать, отсоединить его перед сохранением в базе данных. Существует Property таблица, которая является основной, а таблицы истории и сведений связаны Property с общим PropertyId ключом as. Когда я отсоединяю объект от репозитория и пытаюсь его сохранить, это приводит к ошибке.

Делаю это.

 Repository.Detach(P);
  

Ошибки при

 Repository.SaveChanges();
  

Ошибка:

Оператор INSERT конфликтовал с ограничением ВНЕШНЕГО КЛЮЧА «FK_History_Property».
Конфликт произошел в базе данных «база данных», таблица «dbo.Свойство», столбец ‘PropertyID’.
Оператор был завершен.

Ответ №1:

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

Пример:

Таблица транзакций

 TransactionID DateOfTransaction CustomerID
1             11/15/11          1
2             11/15/11          2
3             11/15/11          15
4             11/15/11          3
  

Сведения о транзакции

 TransactionDetailID TransactionID ItemID Quatity
1                   1             43     15
2                   1             32      2
3                   2             43     89
4                   4             32     12
  

TransactionID вот внешний ключ (первичный ключ из другой таблицы). Прежде чем вы сможете удалить родительскую запись в таблице транзакций, вы должны сначала удалить все записи, которые ссылаются на ее PrimaryKey, чтобы избежать ОШИБОК ОГРАНИЧЕНИЯ ВНЕШНЕГО КЛЮЧА

Пример:

Если вы хотите удалить транзакцию 1 из базы данных, вам необходимо сначала удалить сведения о транзакции (сведения о транзакции 1 и 2), прежде чем вам будет разрешено удалить TransactionID 1

Комментарии:

1. Как мы можем удалить дочерний объект. если я пытаюсь сделать это, как P.History и P.Detail, тогда это значение равно null, поэтому я могу удалить это.

Ответ №2:

Я думаю, вы имеете в виду использовать

 Repository.DeleteObject(P);
  

за которым следует

 ObjectContext.SaveChanges();
  

Это, конечно, предполагает, что вы действительно используете некоторые из более поздних версий EntityFramework, которые поддерживают модель DbContext.

В более ранних версиях изменения репозитория можно было вносить на уровне репозитория или на уровне ObjectContext, выполняя что-то вроде

 ObjectContext.DeleteObject(P);
  

за которым следует

 ObjectContext.SaveChanges();
  

Комментарии:

1. Это вызывает ту же проблему, но не выдает ошибку внешнего ключа. Связь не может быть изменена, поскольку одно или несколько свойств внешнего ключа не обнуляются. Когда в отношение вносится изменение, связанному свойству внешнего ключа присваивается значение null. Если внешний ключ не поддерживает значения null, необходимо определить новую связь, свойству внешнего ключа должно быть присвоено другое значение, отличное от null, или несвязанный объект должен быть удален. в System.Data.Objects. ObjectContext.SaveChanges(параметры сохранения) в

2. Удаление его в репозитории не означает, что он может быть удален должным образом. Вы также должны учитывать ограничения внешнего ключа, которые ссылаются на первичный ключ таблицы.