2010-08-07 2 views
1

У меня есть небольшая проблема при использовании общего хранилища с EF4. Во-первых, позвольте мне показать вам код, я использую, чтобы получить доступ к коллекции объектов (это код в родовом reposiroy):Общая проблема с хранилищем EF4 Code First

public IEnumerable<T> FindAll<T>() where T : class 
    { 
     return ObjectContext.CreateObjectSet<T>(); 
    } 

Ниже приведен пример этого кода, вызывается для хранилища типа книги

_returnedBooks = _dataContext.FindAll<Book>() 
      .Where(b => b.Title == _editedtitle && b.Description == _editedDescription && b.ImageUrl == _editedImageUrl); 

В приведенном выше коде показано, что я запрашиваю контекст данных для книги, которая имеет свойства, соответствующие значениям, которые я использовал для редактирования книги ранее (отсюда и предикат _edited). Но как только я редактировал эту книгу, я не называл Save Changes в контексте данных.

И есть проблема, хотя я не сохранил изменения, FindAll (в этом случае книга) возвращает книгу с отредактированными значениями. Однако, когда я проверяю DbSet (требуется для регистрации класса для использования с Code First), он не находится в этой коллекции.

Итак, мне не удалось найти какую-либо документацию для этого поведения, или я сам и пропущу очевидное.

Помощь meeeeeeeeeeeeeeeeeeeeeeeee :)

ответ

1

Вы используете один и тот же DataContext? DataContext кэширует незафиксированные изменения и возвращает их при последующих запросах, независимо от того, вы вызвали SaveChanges() или нет. Если вы хотите избежать получения незавершенных изменений, вам нужно будет создать новый или альтернативный контекст.

+0

Hey RobS, Я использую его в области Singleton, как определено в моем контейнере DI. Тем не менее, я также попробовал переходный режим и область запроса как для контекста данных, так и для фабрики репозитория, которая использует их с теми же результатами. Наверное, лучше всего дважды проверить это сейчас. Спасибо, что нашли время ответить. – nick

+0

Эй, я вернулся и понял, что на самом деле мои тесты говорят, что объект был обновлен, а не мой фактический код. И в моих тестах я использовал тот же экземпляр DataContext - и, как вы говорите, это кеширование данных. Итак, я префикс каждого вызова FindAll с _dataContext = new NTCodingDataContext() ;. И мои тесты стали зелеными. Да, детка! Извините, я не могу отметить как ответ, потому что у меня низкая репутация, но я определенно благодарен, что вы мне помогли :) – nick

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