2013-08-06 3 views
0

У меня есть лица что-то вроде этого:EF 4 обновления данных

public class Customer 
{ 
    public string Id { get; set; } 
    public string Name { get; set; } 
} 

Я читаю с помощью Linq следующим образом:

public IQueryable<Customer> GetCustomer() 
{ 
    var result = from cust in _dbContext.Customers.AsNoTracking() select cust; 
    return result; 
} 

Первый раз все работает просто отлично, но когда я добавил клиента в DB вручную, тот же клиент не отражает этот запрос, он всегда возвращает старые записи.

Так как же я всегда получаю обновленных клиентов из БД?

Примечание: Я использую EF 4

ответ

0

Проблема заключается в вызове метода .AsNoTracking() AsNotracking() метод является индивидуальный список данных, проверить по ссылке http://msdn.microsoft.com/en-us/data/hh949853.aspx в 5.1 пункта объясняет это:

Если вы находитесь в сценарии только для чтения и хотите избежать накладных расходов , загружая объекты в ObjectStateManager, вы можете выдать запросы «Нет Отслеживание». Отслеживание изменений можно отключить по запросу .

Обратите внимание, что, отключив отслеживание изменений, вы эффективно удалили кеш объектов. . Когда вы запрашиваете сущность, мы не можем отказаться от материализации, вытащив ранее реализованный запрос результатов ObjectStateManager. Если вы повторно запрашиваете для тех же объектов в одном контексте, вы можете увидеть преимущество производительности от включения отслеживания изменений.

При выполнении запроса с использованием ObjectContext, ObjectQuery и ObjectSet экземпляры будут помнить MergeOption когда он установлен, и запросы, составленные на них унаследует эффективную MergeOption родительского запроса. При использовании DbContext отслеживание можно отключить, вызвав модификатор AsNoTracking() на DbSet.

удалить .AsNoTracking() для запроса ссылки

+0

даже после удаления .AsNoTracking() также его до сих пор чтение из кэша, а не отражает дату в БД. –

+0

Я использую вышеуказанный код, и он работает хорошо. Это может зависеть от того, как вы вводите данные в контексте. При выполнении вставки вы используете _dbContext.Customers.Add (клиент) .... или выполняет вставку через SQLComand? –

+0

Я вставил запись вручную в БД, так как я могу обновить контекст? –