Я работаю над службой Windows, которая использует EF 4.1. Он считывает данные из веб-службы и вставляет ее в несколько таблиц Cache каждые 4 часа или около того. Около 3 тыс. Рядов av.Использование TRUNCATE с EF 4.1 как обновить диспетчер объектов
У меня есть Удаление всех строк с помощью EF 4.1, затем Добавление всех строк в std EF 4.1. работает отлично т.е.
....
foreach (var entityI in entityList)
{
_dbContext.GetDbSet<T>().Remove(entityI);
}
SaveChanges();
....
foreach (var entityI in entityList)
{
_dbContext.GetDbSet<T>().Add(entityI);
}
SaveChanges();
То, что я пытаюсь сделать, это использовать TRUNCATE TABLE вместо удаления, но когда я делаю это, TRUNCATE TABLE работает отлично, но добавлять строки не удается говоря диспетчер объектов находится вне стадии.
_dbContext.ExecuteSqlCommand("TRUNCATE TABLE " + entityName);
Изменения в базе данных были успешно завершены, но при обновлении контекста объекта произошла ошибка. Объект ObjectContext может находиться в несогласованном состоянии. Внутреннее сообщение об исключении: AcceptChanges не может продолжаться, потому что ключевые значения объекта конфликтуют с другим объектом в ObjectStateManager. Перед вызовом AcceptChanges убедитесь, что значения ключа уникальны.
Как сообщить диспетчеру объектов EF, что я усекал все строки в таблице?
Имел подобную мысль. Нет записей, возвращающихся из GetObjectStateEntries, хотя я могу найти их с помощью GetObjectByKey. Но тогда не может отсоединиться. –
Наконец-то вернулись строки, но теперь говорят, что объект нельзя отделить, потому что он не подключен. Для присоединения мне нужен IEntityWithKey. –
Можете ли вы попробовать выполнить объектContext.Refresh (RefreshMode.StoreWins, objectContext.) после выполнения команды truncate? Это должно перезагрузить объекты из хранилища данных, которые должны быть пустыми. –
scheien