Этот вопрос очень похож на этот . Однако решение этого вопроса:
- Не похоже, или
- Несколько подозрительны и не кажутся хорошим подходом к решению проблемы.
По сути, я перебираю общий список объектов и вставляю их. Использование MVC 2, EF 4 с генерацией кода по умолчанию.
foreach(Requirement r in requirements)
{
var car = new CustomerAgreementRequirement();
car.CustomerAgreementId = viewModel.Agreement.CustomerAgreementId;
car.RequirementId = r.RequirementId;
_carRepo.Add(car); //Save new record
}
И метод Repository.Add ():
public class BaseRepository<TEntity> : IRepository<TEntity> where TEntity : class
{
private TxRPEntities txDB;
private ObjectSet<TEntity> _objectSet;
public void Add(TEntity entity)
{
SetUpdateParams(entity);
_objectSet.AddObject(entity);
txDB.SaveChanges();
}
Я должен отметить, что я успешно использовал метод Add () по всему коду для одиночных вставок; это первый раз, когда я пытался использовать его для итеративной вставки группы объектов.
Ошибка:
System.InvalidOperationException: изменения в базе данных были успешно приняты, но произошла ошибка при обновлении контекста объекта. ObjectContext может быть в несовместимом состоянии. Внутреннее сообщение об исключении: AcceptChanges не может продолжаться, потому что значения ключа объекта конфликтуют с другим объектом в ObjectStateManager. Убедитесь, что значения ключей являются уникальными, прежде чем вызывать AcceptChanges.
Как указано в предыдущем вопросе, для EntityKey задано значение True, StoreGeneratedPattern = Identity. Фактическая таблица, в которую вставляется таблица, представляет собой таблицу отношений, в которой она состоит из поля идентификатора и двух полей внешнего ключа. Ошибка всегда возникает при вставке second , независимо от того, была ли эта конкретная сущность вставлена ранее или нет, и я могу подтвердить, что значения всегда различны, никакие ключи не конфликтуют с базой данных. Я подозреваю, что это как-то связано с временным ключом, который устанавливается до фактической вставки, но я не знаю, как это подтвердить, и не знаю, как его разрешить.
Мне кажется, что решение предыдущего вопроса - установить для параметра SaveOptions значение None - не лучшее решение. (См. Предварительное обсуждение здесь )