2014-01-08 3 views
0

Я работаю над службой 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, что я усекал все строки в таблице?

ответ

0

Вы можете попытаться отсоединить все соответствующие объекты от ObjectStateManager. Затем сущности будут отвечать за сбор мусора и, наконец, удалить.

var adapter = (IObjectContextAdapter)_dbContext; 
var objectContext = adapter.ObjectContext; 

var entries = objectContext.ObjectStateManager.GetObjectStateEntries(EntityState.Added | EntityState.Modified); 

foreach(var entry in entries) 
{ 
    objectContext.Detach(entry); 
} 
+0

Имел подобную мысль. Нет записей, возвращающихся из GetObjectStateEntries, хотя я могу найти их с помощью GetObjectByKey. Но тогда не может отсоединиться. –

+0

Наконец-то вернулись строки, но теперь говорят, что объект нельзя отделить, потому что он не подключен. Для присоединения мне нужен IEntityWithKey. –

+0

Можете ли вы попробовать выполнить объектContext.Refresh (RefreshMode.StoreWins, objectContext. ) после выполнения команды truncate? Это должно перезагрузить объекты из хранилища данных, которые должны быть пустыми. – scheien

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