2010-10-06 4 views
4

У меня есть это приложение, которое на самом деле является двумя приложениями, веб-приложениями и консольным приложением. Консольное приложение используется в качестве запланированной задачи на машине Windows и выполняется 3 раза в день до некоторой повторяющейся работы. Оба приложения используют одну и ту же модель и репозиторий, которые помещаются в отдельный проект (библиотека классов). Проблема заключается в том, что если консольному приложению необходимо внести изменения som в базу данных, он обновляет модельный объект и сохраняет изменения в базе данных, но когда это происходит, контекст в webbapplication не знает об этом, и поэтому контекст объекта не обновляется с помощью новые/обновленные данные и пользователь приложения не могут видеть изменения.Убедитесь, что структура Entity всегда читает из базы данных?

Мой вопрос: есть ли способ сообщить объекту contexttext всегда загружать данные из базы данных, будь то в объекте objectcontext или для конкретного запроса?

/Отношения Vinblad

ответ

2

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

В любом случае существует несколько методов, которые могут заставить ObjectContext перезагружать данные. Запросы и функции загрузки позволяют передавать MergeOption, который должен иметь возможность перезаписывать текущие данные. Но самым интересным должен быть метод Refresh, особенно с this application.

1

Всякий раз, когда вы запускаете что-то вроде

context.Entities.FirstOrDefault() 

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

Ваш ObjectContext Срок службы в webapp? ObjectContext - это UnitOfWork, поэтому он должен быть создан только для получения/записи/обновления данных и впоследствии быстро удаляться. Вы можете найти подобный вопрос здесь:

Refresh ObjectContext or recreate it to reflect changes made to the database?

+5

Это неправда. Если вы запустите свой запрос, измените свои данные в БД и снова запустите запрос в том же контексте, вы не получите новые данные. ObjectContext реализует несколько шаблонов - это называется Identity Map, что означает, что объект одного и того же ключа загружается только один раз. –

+0

Спасибо Yakimych за информацию, ссылку, которую вы мне предоставили, меня в правильном направлении, оказалось, что мне нужна поддержка PerWebRequest в Unity (я использовал эту реализацию, которая, похоже, работает: http://weblogs.asp.net /rashid/archive/2009/02/15/asp-net-mvc-unity-and-common-service-locator.aspx) – Vinblad

+0

@Ladislav - спасибо за исправление! @Vinblad - рад, что я мог бы помочь;) – Yakimych

0

FWIW, создавая новый (анонимный) объект в запросе также вынуждает путешествие туда и обратно в базу данных:

' queries from memory  
context.Entities.FirstOrDefault() 

' queries from db 
context.Entities.Select(Function(x) New With {p.ID, p.Name}).FirstOrDefault() 

Пожалуйста, простите VB, это мой родной язык :)

1

По Используя DbSet, вы также можете использовать метод .AsNoTracking().

+0

Это на самом деле хороший ответ. Просто добавьте .AsNoTracking() как часть вашего запроса и сущности Framework не будет полагаться на экземпляры в памяти объектов. –

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