Как правильно использовать контексты объектов в Entity Framework, используя BackgroundWorker - PullRequest
0 голосов
/ 25 мая 2010

Я занимаюсь разработкой с использованием Entity Framework и WPF, и у меня возникают некоторые ошибки, и я не знаю, почему. При сохранении записи (используя BackgroundWorker) я устанавливаю трекер изменения сущностей на ноль (ноль), присоединяю запись к новому одноразовому контексту, сохраняю ее, отсоединяю и удаляю контекст.

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

Private Sub _saveRecordWorker_DoWork(ByVal sender As Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles _saveRecordWorker.DoWork
    Using MyContext As New RVShippingEntities
        Dim MyShipment = CType(ShipmentRecord, IEntityWithChangeTracker)
        MyShipment.SetChangeTracker(Nothing)
        MyContext.Attach(MyShipment)
        MyContext.Detach(ShipmentRecord)
    End Using
End Sub

Фоновый рабочий Refresh похож, но у него есть блок Do While, чтобы он не мешал рабочему сохранения (который, кажется, не работает; отсюда и сообщение). Когда я сохраняю (и он впоследствии обновляется), я получаю следующую ошибку: Вызывающий поток не может получить доступ к этому объекту, поскольку он принадлежит другому потоку.

Я думал, что с блоком DoWhile он будет ждать (и когда я перейду через него), пока не закончится поток сохранения, и все будет хорошо. Но может показаться, что что-то (основной поток или поток сохранения) все еще делает что-то, что мешает.

Есть ли лучший способ сделать это? Я делаю это глупо и глупо? Любая помощь будет оценена.

(Очевидно, Firefox распознал слово kludgey. Интересно)

1 Ответ

0 голосов
/ 16 июля 2011

Итак, 3 с лишним месяца и ни одно исключение в отношении Entity Framework. Я собираюсь назвать это ответом.

Родительские представления (в моем случае Компания, Клиент, Отгрузка) имеют контекст, который при необходимости передается дочерним представлениям (Адреса, Номера телефонов, Адреса электронной почты, для Компании и Клиента; Пакеты, Содержимое, Отгрузки). Каждый раз, когда контекст не может сохранить изменения или что у вас (отключение базы данных является наиболее распространенной причиной), контекст удаляется, создается новый экземпляр, сущности повторно присоединяются, устанавливаются на изменение (на основе отслеживания пользовательских изменений, которое я выполняю для пользовательского интерфейса), и изменения сохраняются.

...