none
Entity Framework et edmx RRS feed

  • Question

  • Bonjour,

    Voilà, j'ai deux questions:

    1) Je suis parti de Entity Framework code first pour générer ma DB vu que j'avais déjà développé mes classes(entités). Cependant, comme je suis en train d'étudier la question de l'accès concurrentiel, j'ai trouvé dans les exemples sur le net qui parlent de  modifier la propriété Concurrency Mode des entités susceptibles d'être mise à jour. Or, pour jouer sur la propriété Concurrency Mode il faut avoir accès au modèle edmx pour visualiser les différentes entités. Et c'est là que je n'arrive pas à trouver le moyen pour générer le modèle d'entités à partir de mes classes(entités). J'ai même créer un fichier edmx vide et j'ai essayé en mode design d'y ajouter mes classes mais je n'y arrive pas !

    2) Je ne trouve pas la méthode Refresh du context sous EF 6 pour que je puisse gérer l'exception levée lorsque SaveChanges() est exécutée ?

    Merci d'avance.


    Beel


    • Modifié beela lundi 1 décembre 2014 08:45
    lundi 1 décembre 2014 08:44

Réponses

  • Je vois que vous êtes catégorique. Je veux bien, mais, je viens de trouver une réponse à la page suivante :

    http://msdn.microsoft.com/fr-fr/data/jj592904.aspx, où on propose une solution pour la résolution des exceptions d'accès concurrentiel.

    Alors, je vous comprends pas très bien !

    Cordialement.


    Beel

    • Marqué comme réponse beela lundi 1 décembre 2014 12:02
    lundi 1 décembre 2014 11:21
  • Ok, en tout cas votre réponse, m'a aider à mieux comprendre le traitement dans le catch en ce sens que même avec l'utilisation d'un DBContext, je pouvais encore personnaliser le traitement de ce dernier.

    Merci et cordiales salutations.


    Beel

    • Marqué comme réponse beela lundi 1 décembre 2014 15:53
    lundi 1 décembre 2014 14:46

Toutes les réponses

  • Bonjour,

    Pour gérer l'accès concurrentiel il n'est pas nécessaire de passer par un EDMX. Il suffit de définir des attributs sur des champs de vos entités. Généralement on utilise un champ spécifique de type [TimeStamp] qui change à chaque modification de la ligne de détecter les modifications plus rapidement.

    Il y a toutes les explications dans cette page : http://www.asp.net/mvc/overview/older-versions/getting-started-with-ef-5-using-mvc-4/handling-concurrency-with-the-entity-framework-in-an-asp-net-mvc-application

    Je ne comprends pas votre seconde question : pour gérer les exceptions lors du SaveChanges() il suffit de les encapsuler dans un try/catch.

    Cordialement,


    Yan Grenier

    lundi 1 décembre 2014 10:37
  • Bonjour,

    Merci pour votre réponse. Je vais lire les explications de la page que vous m'avez proposé.

    Pour la deuxième question. Je gère bien l'exception dans un try - catch, mais le problème,  d'après l'exemple ce -dessous, la méthode Refresh n'existe pas sous EF 6:

    using (AdventureWorksEntities context = new AdventureWorksEntities()) { try { // Perform an operation with a high-level of concurrency. // Change the status of all orders without an approval code. ObjectQuery<SalesOrderHeader> orders = context.SalesOrderHeaders.Where("it.CreditCardApprovalCode IS NULL").Top("100"); foreach (SalesOrderHeader order in orders) { // Reset the order status to 4 = Rejected. order.Status = 4; }

    try { // Try to save changes, which may cause a conflict. int num = context.SaveChanges(); Console.WriteLine("No conflicts. " + num.ToString() + " updates saved."); } catch (OptimisticConcurrencyException) { // Resolve the concurrency conflict by refreshing the  // object context before re-saving changes. context.Refresh(RefreshMode.ClientWins, orders); // Save changes. context.SaveChanges(); Console.WriteLine("OptimisticConcurrencyException "+ "handled and changes saved"); } foreach (SalesOrderHeader order in orders) { Console.WriteLine("Order ID: " + order.SalesOrderID.ToString() + " Order status: " + order.Status.ToString()); } } catch (UpdateException ex) { Console.WriteLine(ex.ToString()); } }

    Je ne sais pas s'il existe un autre moyen de faire ?


    Beel


    • Modifié beela lundi 1 décembre 2014 10:53
    lundi 1 décembre 2014 10:52
  • Je pense que 'Refresh()' est une méthode d'un contexte venant d'un EDMX (je ne m'en sers jamais donc je ne peux que supposer).

    Dans la page fournie il est indiqué comment gérer une exception 'DbUpdateConcurrencyException' et comment en extraire les informations se trouvant dans la base et celles que vous essayez de transmettre. A vous ensuite de prendre la décision qui s'impose en fonction de votre besoin.

    Cordialement,


    Yan Grenier

    lundi 1 décembre 2014 11:04
  • Ok. Je pensais que le code avec la methode Refersh et juste après refaire un SaveChanges () était plus simple pour résoudre le problème d'accès concurrentiel !

    Beel

    lundi 1 décembre 2014 11:09
  • Non, la gestion des accès concurrentiels étant dépendante de votre logique métier, aucun système ne peut vraiment l'automatiser.

    Cordialement,

    PS : n'oubliez pas de marquer "Comme réponse" les posts qui ont été utiles et/ou qui ont résolus la question.


    Yan Grenier

    lundi 1 décembre 2014 11:14
  • Je vois que vous êtes catégorique. Je veux bien, mais, je viens de trouver une réponse à la page suivante :

    http://msdn.microsoft.com/fr-fr/data/jj592904.aspx, où on propose une solution pour la résolution des exceptions d'accès concurrentiel.

    Alors, je vous comprends pas très bien !

    Cordialement.


    Beel

    • Marqué comme réponse beela lundi 1 décembre 2014 12:02
    lundi 1 décembre 2014 11:21
  • Oui c'est ce que je dis :) C'est UNE solution. C'est à vous de décidez de ce qu'il faut faire lors d'un accès concurrentiel (logique métier).

    Vous pouvez avoir différents scénarios (abandon pur et simple des modifications, demande de comparaison de la part de l'utilisateur, enregistrement d'une version différente pour validation par un tiers, etc.). Par conséquent EF ne fourni pas de système de résolution automatique, mais des outils vous permettant de mettre en œuvre les scénariis qui vous conviennent.

    Cordialement,


    Yan Grenier

    lundi 1 décembre 2014 12:59
  • Ok, en tout cas votre réponse, m'a aider à mieux comprendre le traitement dans le catch en ce sens que même avec l'utilisation d'un DBContext, je pouvais encore personnaliser le traitement de ce dernier.

    Merci et cordiales salutations.


    Beel

    • Marqué comme réponse beela lundi 1 décembre 2014 15:53
    lundi 1 décembre 2014 14:46