Entity Framework - одно приложение / один пользователь / один простой вариант использования ... кажется простым, но это не так - PullRequest
0 голосов
/ 29 марта 2012

У меня есть простое приложение с расписанием.Он управляет:

  • Группа сотрудников
  • Сотрудники
  • Список WorkEntry для каждого сотрудника

Вариант использования следующий:

  1. Мой пользователь запускает приложение и подключается к базе данных.
  2. Он просматривает свой WorkEntry за день.
  3. Он добавляет 2 новых WorkEntries, но НЕ сохраняя данные прямо сейчас.
  4. Он печатает WorkEntries, диалоговое окно показывает ему ход операции, выполнение которой может занять некоторое время.

Когда я впервые запустил приложение, у меня был один ObjectContext, созданный в соединении (в потоке пользовательского интерфейса) и удаленный, когда пользователь закрыл приложение.

Это работало довольно хорошо, но я столкнулся с проблемой реализации функции печати, потому что я не смог использовать ObjectContext в фоновом рабочем потоке.

Немного погуглив, я нашел концепциюединицы работы.

  • Создать ObjectContext
  • Хотите, чтобы вы хотели сделать
  • Закрыть его

Кроме того, я понимаю, что сущности принадлежатк одному ObjectContext.

Допустим, ObjectContext # 1 - Используется в потоке пользовательского интерфейса для получения WorkEntries за день - Содержит две новые WorkEntries пользователя.- Еще не удален, потому что пользователь не сохранил свои изменения

Пусть скажем ObjectContext # 2 - Используется в фоновом рабочем потоке - Восстановить WorkEntries на день - Распечатать WorkEntries

Как можноObjectContext # 2 знать о двух новых WorkEntries в ObjectContext # 1?


EDIT

Я знаю, что есть недостаток ... пользователь ДОЛЖЕН сохранитьчтобы получить две новые записи в печатном отчете.

Но, допустим, мое приложение представляет данные в виде таблицы, как Excel.Пользователь будет ожидать ( по уважительным причинам ) того же поведения, что и Excel.То есть в Excel мне не нужно сохранять для печати новых строк ... Я просто хочу напечатать то, что вижу на своем листе, независимо от состояния сохранности представленных данных.

Ответы [ 3 ]

2 голосов
/ 29 марта 2012

Если я читаю это правильно, значит, вы думаете об этом неправильно.Поток должен идти примерно так (псевдокод)

Пользователь запрашивает данные:

Open a context
Retrieve data
Close the context

Пользователь сохраняет данные:

Open a context
Save the data
Close the context

Печать рабочих записей:

Open a context
Retrieve the data
Close the context
Print the data

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

СЕЙЧАС , иногда существует действительный подход кподдержание контекста открытым на протяжении всей жизни приложения.Тем не менее, то же правило должно применяться.Если пользователь сохраняет данные, другой контекст сразу же узнает об этом, так как при запросе на печать он будет извлекать свежие данные из базы данных.Опять же, если пользователь не сохраняет свои изменения, то его нет в базе данных, поэтому он не будет распечатан.Что если мы распечатаем его и пользователь решит отказаться от изменений?Если вы хотите избежать такой ситуации, вам, вероятно, следует предложить пользователю, чтобы при печати не были сохранены несохраненные данные, и позволить им выбрать, хотят ли они по-прежнему печатать или сохранять данные.Если вы хотите разрешить им печатать сохраненные И несохраненные данные, то это другая проблема, чем контексты EF

0 голосов
/ 29 марта 2012

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

Общий подход подобен следующему

using(YourContext context = new YourContext)
{
 // Do stuff here
 // and then when you pass the using block context is disposed so you can reuse it
}
0 голосов
/ 29 марта 2012

Создайте # 2 только тогда, когда вы собираетесь начать печать (а не когда приложение запускается).Он запросит резервное хранилище данных и получит самые последние данные за этот момент времени.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...