Странно здесь. Я использую EF 6 поверх SQL Server 2012 и C #.
Если я удаляю запись, используя DeleteObject, я получаю:
//order.orderitem count = 11
db.OrderItem.DeleteObject(orderitem);
db.SaveChanges();
var order = db.order.First(r => r.Id == order.id);
//Order.OrderItem count = 10, CORRECT
Если я удаляю позицию заказа, используя встроенный DML ExecuteStoreCmd, я получаю:
//order.orderitem count = 11
db.ExecuteStoreCommand("DELETE FROM ORDERITEM WHERE ID ={0}", orderitem.Id);
var order = db.Order.First(r => r.Id == order.id);
//order.orderitem count = 11, INCORRECT, should be 10
Таким образом, версия ExecuteStoreCommand сообщает 11, однако OrderItem определенно удален из БД, поэтому он должен сообщить 10. Также я бы подумал, что First () выполняет поиск Eager, таким образом, повторно заполняя коллекцию "order.orderitem".
Есть идеи, почему это происходит? Спасибо.
РЕДАКТИРОВАТЬ: я использую ObjectContext
РЕДАКТИРОВАТЬ 2: Это самое близкое рабочее решение, которое я использовал, используя "отсоединить". Интересно, что «отсоединение» на самом деле занимает около 2 секунд! Не уверен, что он делает, но это работает.
db.ExecuteStoreCommand("DELETE FROM ORDERITEM WHERE ID ={0}", orderitem.Id);
db.detach(orderitem);
Было бы быстрее запросить и снова заполнить набор данных. Как я могу форсировать запрос? Я думал, что следующее сделает это:
var order = db.order.First(r => r.Id == order.id);
РЕДАКТИРОВАТЬ3: кажется, работает, чтобы принудительно удалить сообщение обновления, но все еще занимает около 2 секунд:
db.Refresh(RefreshMode.StoreWins,Order.OrderItem);
Я все еще не совсем понимаю, почему нельзя просто запросить запрос типа Order.First (r => r.id == id), который часто занимает намного меньше 2 секунд.