2009-12-22 4 views
2

Мы имеем длинный рамочный объект контекста работает (не спрашивайте, почему ...), с запросом, который возвращает объект пользователя с его ассоциациями:Entity Framework - Удалена ассоциация по-прежнему появляется во втором вызове

var user = entities.UserSet.Include("UserAddresses") 
        .Where(u => u.Id == 1).FirstOrDefault(); 

Если строка адреса пользователя удалена из базы данных (другим процессом), и мы снова запустим этот запрос, мы по-прежнему получаем удаленную строку, даже если мы устанавливаем MergeOption перед вызовом (чтобы идти база данных в любом случае и не использовать кеш):

(Пробовал любой набор, который у меня есть в запросе, без успеха)

entities.UserSet.MergeOption = System.Data.Objects.MergeOption.OverwriteChanges; 
entities.UserAddress.MergeOption = System.Data.Objects.MergeOption.OverwriteChanges; 
entities.UserSet.Include("UserAddresses").MergeOption = System.Data.Objects.MergeOption.OverwriteChanges; 

Может ли кто-нибудь помочь в решении этой проблемы?

ответ

2

Нет опции, которая автоматически удалит элемент в памяти, который не находится на диске.

http://blog.dynatrace.com/2009/03/11/adonet-entity-framework-unexpected-behaviour-with-mergeoptions/

Вы можете очистить весь контекст, но это, вероятно, вызовет у вас другие проблемы.

В принципе, EF плохо работает с длинными контекстами работы, вам может быть быстрее решить проблему и получить более стабильную систему, удалив длинные контексты.

0

Перед тем, как выбрать после удаления, вы должны перейти .SaveChanges(). Нет другого пути.