IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Entity Framework Discussion :

Introduction par l'exemple à Entity Framework 5 Code First


Sujet :

Entity Framework

  1. #1
    Expert éminent

    Profil pro
    Inscrit en
    Avril 2009
    Messages
    131
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 131
    Points : 6 550
    Points
    6 550
    Par défaut Introduction par l'exemple à Entity Framework 5 Code First
    Bonjour,

    J'ai mis en ligne "Introduction par l'exemple à Entity Framework 5 Code First". C'est un tutoriel destiné en priorité aux débutants même s'il peut intéresser d'autres publics.

    - Création d'une base SQL Server 2012 à partir d'entités EF5 ;
    - Ajout, Modification, Suppression d'entités ;
    - Requêtage du contexte de persistance avec LINQ to Entities ;
    - Gestion des entités détachées ;
    - Lazy et Eager loading ;
    - Concurrence d'accès aux entités ;
    - Synchronisation du contexte EF5 avec la base de données ;
    - Etude d'une application ASP.NET avec une architecture multi-couche ayant EF5 comme ORM et SQL Server 2012 comme SGBD ;
    - Portage de l'application ASP.NET sur le SGBD MySQL 5.5.28 ;
    - Portage de l'application ASP.NET sur le SGBD Oracle Database Express Edition 11g Release 2 ;
    - Portage de l'application ASP.NET sur le SGBD PostgreSQL 9.2.1 ;
    - Portage de l'application ASP.NET sur le SGBD Firebird 2.1.

    L'application ASP.NET étudiée ci-dessus est celle utilisée dans le document [http://tahe.developpez.com/dotnet/pam-aspnet] où l'ORM était NHibernate et le SGBD MySQL 5. L'ORM est ici remplacé par EF5 et cinq SGBD sont testés.

    Outils utilisés :

    - Visual Studio Express 2012 pour le bureau ;
    - Visual Studio Express 2012 pour le web ;
    Vous pouvez sur ce forum, laisser des commentaires, signaler des erreurs, des difficultés, échanger des idées.

  2. #2
    Membre à l'essai
    Profil pro
    Développeur informatique
    Inscrit en
    Février 2003
    Messages
    12
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2003
    Messages : 12
    Points : 16
    Points
    16
    Par défaut Merci
    Simplement Merci

  3. #3
    Membre averti
    Avatar de SoBaKa
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juillet 2006
    Messages
    242
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juillet 2006
    Messages : 242
    Points : 349
    Points
    349
    Par défaut
    Bonjour Serge,

    A première vue ton introduction me paraît très sympa, beau boulot.

    Par contre j'ai 1 petite question et 1 commentaire :

    Si les champs proposés sont naturels, les mots clés virtual ne le sont pas. C'est une contrainte imposée à la fois par NHibernate et
    EF5 : les champs des entités doivent être des propriétés publiques virtuelles.
    Dans la création d'une entité (page 26), tu indiques que les entités doivent être "virtual"... Utilisant déjà 'EF5 Code First', je n'ai jamais déclaré mes propriétés de cette manière. (Bien qu'ayant déjà vu cela sur des forums anglais). Ma question, quel est l'intérêt de les déclarer "virtual"?

    ------------------

    Page 33, tu souhaites donc initialiser tes noms de table en surchargeant la méthode "OnModelCreating"... C'est assez dommage de procéder de cette manière vu qu'on peut définir le nom de la table et le schéma au niveau de notre entité également.

    En utilisant l'attribut Table qui vient de System.ComponentModel.DataAnnotations.Schema.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    [Table("MEDECINS", Schema = "dbo")]
    public class Medecin
    {
      // ...
    }
    Bonne journée.
    ****** Analyse/Développeur .Net

  4. #4
    Expert éminent

    Profil pro
    Inscrit en
    Avril 2009
    Messages
    131
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 131
    Points : 6 550
    Points
    6 550
    Par défaut
    @Sobaka

    Dans la création d'une entité (page 26), tu indiques que les entités doivent être "virtual"... Utilisant déjà 'EF5 Code First', je n'ai jamais déclaré mes propriétés de cette manière. (Bien qu'ayant déjà vu cela sur des forums anglais). Ma question, quel est l'intérêt de les déclarer "virtual"?
    Bah... Je croyais que c'était obligatoire. Tu me démontres que non. Au temps pour moi. Pour NHibernate, c'est obligatoire car les méthodes sont redéfinies par NHibernate. J'ai peut-être extrapolé un peu vite pour EF5 ?

    Page 33, tu souhaites donc initialiser tes noms de table en surchargeant la méthode "OnModelCreating"... C'est assez dommage de procéder de cette manière vu qu'on peut définir le nom de la table et le schéma au niveau de notre entité également.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    [Table("MEDECINS", Schema = "dbo")]
    public class Medecin
    {
      // ...
    }
    Merci pour l'information. Je savais qu'on pouvait déclarer la table ainsi mais je ne le savais pas pour le schéma.

  5. #5
    Membre averti
    Avatar de SoBaKa
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juillet 2006
    Messages
    242
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juillet 2006
    Messages : 242
    Points : 349
    Points
    349
    Par défaut
    Citation Envoyé par Serge Tahé Voir le message
    Bah... Je croyais que c'était obligatoire. Tu me démontres que non. Au temps pour moi. Pour NHibernate, c'est obligatoire car les méthodes sont redéfinies par NHibernate. J'ai peut-être extrapolé un peu vite pour EF5 ?
    Apparemment oui :p EF5 ne redéfinit aucunes méthodes des entités. En tout cas encore une fois très bon boulot la dessus, j'ai parcouru en vitesse et je pense que c'est à la portée de tous donc pour ceux qui n'ont pas encore lu, dépechez vous.
    ****** Analyse/Développeur .Net

  6. #6
    Membre éclairé

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2006
    Messages
    70
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Octobre 2006
    Messages : 70
    Points : 681
    Points
    681
    Par défaut
    Le mot clé virtual n'est a utilisé uniquement pour les associations, pour le reste pas besoin, sinon vous risquez d'avoir des soucis au chargement des données (genre la collection toujours à Null).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    public class MaTable {
     
    public String MonTitre {get; set;}
     
    public virtual MonAutreTable MonAssociation {get; set;}
     
    public virtual ICollection<MonAutreTable> MaCollection {get; set;}
     
    }

  7. #7
    Membre averti
    Avatar de SoBaKa
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juillet 2006
    Messages
    242
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juillet 2006
    Messages : 242
    Points : 349
    Points
    349
    Par défaut
    Citation Envoyé par acesyde Voir le message
    Le mot clé virtual n'est a utilisé uniquement pour les associations, pour le reste pas besoins, sinon vous risquez avoir des soucis au chargement des données (genre la collection toujours à Null).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    public class MaTable {
     
    public String MonTitre {get; set;}
     
    public virtual MonAutreTable MonAssociation {get; set;}
     
    public virtual ICollection<MonAutreTable> MaCollection {get; set;}
     
    }
    Je ne vois toujours pas ce que ça apporte... une collection ne doit pas être égale à "null" je suis d'accord mais je ne pense pas que le mot clé "virtual" apporte grand chose ici. De plus, tu peux avoir aussi des association qui peuvent être "null".

    Exemple de ce que je trouve plus propre et une association qui peut être "null":

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    public class MaTable
    {
      public int ID { get; set; }
      public string Name { get; set; }
      public int? RelationID { get; set; }
     
      public MonAutreTable Relation { get; set; }
      public ICollection<EncoreAutreTable> Values { get; set; }
     
      public MaTable()
      {
        if(Values == null) Values = new HashSet<EncoreAutreTable>();
      }
    }
    Pas de virtual... et pleinement fonctionnel
    ****** Analyse/Développeur .Net

  8. #8
    Membre éclairé

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2006
    Messages
    70
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Octobre 2006
    Messages : 70
    Points : 681
    Points
    681
    Par défaut
    Je suis d'accord avec toi pour le constructeur avec l'initialisation.

    Par contre j'ai trouvé pas mal de questions d'utilisateurs sur le web du "pourquoi ma collection est toujours vide".

    La réponse est toujours "rajoute le virtual devant" et l'utilisateur à réussit à retrouver ses infos.

    Pourquoi ?
    Ca je ne sais pas

  9. #9
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par SoBaKa Voir le message
    Je ne vois toujours pas ce que ça apporte... une collection ne doit pas être égale à "null" je suis d'accord mais je ne pense pas que le mot clé "virtual" apporte grand chose ici. De plus, tu peux avoir aussi des association qui peuvent être "null".
    À vous lire on dirait que vous n'êtes pas au courant de l'utilité du mot clef virtual sur les propriétés de navigation.

    Donc pour infos le mot clef virtual lorsqu'il est défini sur les propriétés de navigation permet de bénéficier de la fonctionnalité de chargement à la demande (lazy loading) dans l'approche Code First (bien sûr si le développeur ne l'a pas désactivé explicitement dans le code)

  10. #10
    Membre averti
    Avatar de SoBaKa
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juillet 2006
    Messages
    242
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juillet 2006
    Messages : 242
    Points : 349
    Points
    349
    Par défaut
    Citation Envoyé par acesyde Voir le message
    Je suis d'accord avec toi pour le constructeur avec l'initialisation.

    Par contre j'ai trouvé pas mal de questions d'utilisateurs sur le web du "pourquoi ma collection est toujours vide".

    La réponse est toujours "rajoute le virtual devant" et l'utilisateur à réussit à retrouver ses infos.

    Pourquoi ?
    Ca je ne sais pas
    Ok donc je viens de trouver pourquoi

    Donc je pense que Serge a en partie raison sur le fait de "l'obligation" de mettre des propriétés en virtual et surtout les collections comme tu l'as dit.

    Le fait de mettre le mot clef "virtual" sur les collections permet de profiter du Lazy Loading avec EF5 (et depuis EF 4.1 si j'ai bien vu ^^) donc dans ce cas la EF va bien redéfinir les propriétés en virtual.

    Pour informations :
    Dans la partie "Turning off lazy loading for specific navigation properties"
    ****** Analyse/Développeur .Net

  11. #11
    Rédacteur
    Avatar de Nathanael Marchand
    Homme Profil pro
    Expert .Net So@t
    Inscrit en
    Octobre 2008
    Messages
    3 615
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Expert .Net So@t
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2008
    Messages : 3 615
    Points : 8 080
    Points
    8 080
    Par défaut
    Et le pourquoi du comment: lorsque tu fais du LazyLoading ou que tu utilises du TrackingChanges, EF (et NHibernate) utilises des proxy (des classes dérivées du type original) pour redéfinir lesdites propriétés

    Ah ui, c'était marqué dans ton lien

  12. #12
    Invité
    Invité(e)
    Par défaut
    Merci pour cette presentation

  13. #13
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    53
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 53
    Points : 47
    Points
    47
    Par défaut Excellente présentation
    Merci pour cette présentation, elle m'a été très utile.

    Par contre je rencontre un souci avec Oracle et code first.

    Peut-être pouvez vous me renseigner.

    Je suis sur une application MVC 3 avec Oracle.
    Dans votre tutoriel vous parlez de changer le providerfactory à la page 137.

    Mais en MVC 3 je n'ai pas la possibilité de le modifier du coup j'ai une erreur dès que j'essaie de lire ou modifier des données dans mon contexte qui me dit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Une valeur Null a été retournée après l'appel de la méthode « get_ProviderFactory » sur une instance de fournisseur de magasins de type « Oracle.DataAccess.Client.OracleConnection ». Le fournisseur de magasins risque de ne pas fonctionner correctement.
    Savez-vous comment configurer code first et oracle avec MVC ?

    Merci

  14. #14
    Expert éminent

    Profil pro
    Inscrit en
    Avril 2009
    Messages
    131
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 131
    Points : 6 550
    Points
    6 550
    Par défaut
    @durnambule

    Je ne connais pas ASP.NET MVC mais lorsque je génère un tel projet, je vois qu'il y a un [Web.config]. Donc vous pouvez mettre votre configuration EF dedans puis l'exploiter, comme il est fait dans le document avec une appli asp.net webforms. Non ? Je ne suis pas sûr de comprendre le problème.

    ST

  15. #15
    Membre émérite
    Inscrit en
    Janvier 2011
    Messages
    805
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Janvier 2011
    Messages : 805
    Points : 2 918
    Points
    2 918
    Par défaut
    Très beau travail, bravo.

    Si je peux me permettre une critique, je trouve que la différence entre code first et database first aurait mérité plus d'explications. Tel quel, l'article peut laisser croire qu'il s'agit d'un détail technique et que de toute façon la référence est le modèle de données :

    Les entités doivent refléter les tables de la base de données. (p.25)
    Or ce n'est clairement pas le but de l'approche code first (que si j'ai bien compris vous avez été obligé d'utiliser pour des raisons de compatibilité ?) où on va typiquement d'abord construire son modèle objet en essayant de le garder le plus "pur" et le plus dénué possible de toute logique de persistance.

  16. #16
    Expert éminent

    Profil pro
    Inscrit en
    Avril 2009
    Messages
    131
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 131
    Points : 6 550
    Points
    6 550
    Par défaut
    @Luckyluke34

    Je suis d'accord avec vous. Je pense qu'on pourrait dériver les entités de persistance du modèle pour montrer clairement la séparation.

  17. #17
    Membre régulier
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juillet 2005
    Messages
    108
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Boutique - Magasin

    Informations forums :
    Inscription : Juillet 2005
    Messages : 108
    Points : 77
    Points
    77
    Par défaut
    Merci pour ce dactitiel.

    Le Binding WPF Semble avoir changé. ( par rapport a EF 3.5 ) : j'ai une ereur qui me dit de binder avec des DbSet .
    Pourrais je avoir des liens et des exemples de binding WPF et EF5.0.
    Malgrés des recherches je ne trouve rien .

    Encore meci Anthride

  18. #18
    Rédacteur
    Avatar de Nathanael Marchand
    Homme Profil pro
    Expert .Net So@t
    Inscrit en
    Octobre 2008
    Messages
    3 615
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Expert .Net So@t
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2008
    Messages : 3 615
    Points : 8 080
    Points
    8 080
    Par défaut
    Citation Envoyé par anthride Voir le message
    Merci pour ce dactitiel.

    Le Binding WPF Semble avoir changé. ( par rapport a EF 3.5 ) : j'ai une ereur qui me dit de binder avec des DbSet .
    Pourrais je avoir des liens et des exemples de binding WPF et EF5.0.
    Malgrés des recherches je ne trouve rien .

    Encore meci Anthride
    Je te suggère d'ouvrir un autre sujet sur ce forum, qu'on puisse analyser ton problème.
    Mais à première vue, non, rien n'a changé sur le binding en WPF !

  19. #19
    Membre expert Avatar de iberserk
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Novembre 2004
    Messages
    1 795
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 795
    Points : 3 173
    Points
    3 173
    Par défaut
    Bonjour et bravo pour cet article.

    Simplement une petite remarque de DBA: vous utilisez à tord le terme champ lors de la description de vos tables côté SGBD...
    Or une table contient des colonnes...
    Prendre conscience, c'est transformer le voile qui recouvre la lumière en miroir.
    MCTS Database Development
    MCTS Database Administration

  20. #20
    Expert éminent

    Profil pro
    Inscrit en
    Avril 2009
    Messages
    131
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 131
    Points : 6 550
    Points
    6 550
    Par défaut
    @iberserk

    Simplement une petite remarque de DBA: vous utilisez à tord le terme champ lors de la description de vos tables côté SGBD...
    Or une table contient des colonnes...
    C'est noté. Merci. Je le savais et je ferai davantage attention aux termes la prochaine fois.

    Cordialement.

Discussions similaires

  1. Réponses: 22
    Dernier message: 25/11/2014, 05h20
  2. Réponses: 1
    Dernier message: 05/10/2011, 11h45
  3. Faire une Enum avec Entity Framework First Code 4.1
    Par john85 dans le forum ASP.NET MVC
    Réponses: 5
    Dernier message: 05/05/2011, 15h01

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo