2016-12-08 1 views
0

J'ai une application dans WPF (MVVM) et dans mon viewmodel j'ai besoin de sauvegarder de nouvelles entrées. C'est une grande application avec plusieurs onglets et utilise 1 contexte de base de données centrale (EF 5). Lors de l'enregistrement des nouvelles entrées, chaque entrée est validée par programmation, puis insérée ou mise à jour dans la base de données via le DBContext.Comment afficher une fenêtre de chargement dans WPF lors de l'exécution d'opérations Entity Framework avec 1 DBContext?

Chaque fois que le bouton Enregistrer est appuyé cette action est réalisée pour plus d'une centaine d'entrées et prend quelques secondes ....

Lors de l'enregistrement, je voudrais montrer une fenêtre de chargement .... et je bien de le faire via un fil BackgroundWorker ... Quelque chose comme ici: Show loading window

Malheureusement, je suis en train de AccessViolationExceptions avec Entity Framework depuis que je suis seulement en utilisant une seule et même DBContext ...

est-il toute possibilité de montrer le chargement w indow tout en gardant 1 DBContext?

Merci!

+1

Un 'DbContext' pour l'ensemble de l'application est un mauvais anti-pattern dans Entity Framework. Vous voudrez peut-être repenser cela. –

+0

N'utilisez pas non plus d'arrière-plan, utilisez plutôt async-await avec Task api. –

Répondre

0

Je voudrais vous montrer comment je fais:

 EstaOcupado = true; 

     var taskSalvar = Task.Run(() => 
     { 
      var proxyFactory = ServiceLocator.Current.GetInstance<IServiceClientFactory>(); 
      var proxy = proxyFactory.GetCadastrosGeraisService(); 

      proxy.Open(); 

      caixa = Boot.Mapeador.Map<CaixaModel, Caixa>(Caixa); 
      caixa = proxy.SalvarCaixa(caixa); 
      proxy.Close(); 
     }); 

     try 
     { 
      taskSalvar.Wait(); 
      Caixa.EndEdit(); 
      EstaEmEdicao = false; 

     } 
     catch (AggregateException ae) 
     { 
      var msg = WcfProxy.HandleServiceExceptions(ae); 

      Resolve<IMessageVisualizer>() 
       .Show("Atenção", msg, 
        new CustomMessageVisualizerOptions() {Dialog = DialogType.Alert, Prompt = MessageButtons.OK}); 
     } 
     finally 
     { 
      EstaOcupado = false; 

      Caixa = Boot.Mapeador.Map<Caixa, CaixaModel>(caixa); 
     } 

Mon "EstaOcupado" (IsBusy) propriété est binded à une mine de commande qui montre une animation de chargement. Tandis que j'utilise Task, mon taskSalvar s'exécute en arrière-plan, permettant à mon interface utilisateur d'être mise à jour. S'il vous plaît, essayez cette structure.

+0

Je crois que cela va créer un autre fil et me laisser avec le même problème. – user1841243