Précédent   Forum du club des développeurs et IT Pro > Dotnet > Accès aux données > Entity Framework
Entity Framework Forum d'entraide sur le développement avec le modèle d'accès aux données Entity Framework de Microsoft.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Actualité déjà publiée
 
Outils de la discussion
Publicité
'
Vieux 14/10/2012, 17h10   #1
Serge Tahé
Nouveau Membre du Club
 
Inscription : avril 2009
Messages : 64
Détails du profil
Informations forums :
Inscription : avril 2009
Messages : 64
Points : 25
Points : 25
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.

Citation:
- 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.
Serge Tahé est déconnecté   Envoyer un message privé Réponse avec citation 70
Vieux 18/10/2012, 09h35   #2
BugBlaster
Futur Membre du Club
 
Développeur informatique
Inscription : février 2003
Messages : 10
Détails du profil
Informations personnelles :
Âge : 43
Localisation : France, Nord (Nord Pas de Calais)

Informations professionnelles :
Activité : Développeur informatique

Informations forums :
Inscription : février 2003
Messages : 10
Points : 16
Points : 16
Par défaut Merci

Simplement Merci
BugBlaster est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/10/2012, 14h49   #3
SoBaKa
Membre éclairé
 
Avatar de SoBaKa
 
Homme Grégory Houdremont
Développeur .NET
Inscription : juillet 2006
Messages : 225
Détails du profil
Informations personnelles :
Nom : Homme Grégory Houdremont
Âge : 28
Localisation : Belgique

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

Informations forums :
Inscription : juillet 2006
Messages : 225
Points : 303
Points : 303
Envoyer un message via MSN à SoBaKa
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 :

Citation:
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 :
1
2
3
4
5
[Table("MEDECINS", Schema = "dbo")]
public class Medecin
{
  // ...
}
Bonne journée.
__________________
****** Analyse/Développeur .Net
****** Formateur .Net
****** @Twitter
SoBaKa est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/10/2012, 15h17   #4
Serge Tahé
Nouveau Membre du Club
 
Inscription : avril 2009
Messages : 64
Détails du profil
Informations forums :
Inscription : avril 2009
Messages : 64
Points : 25
Points : 25
@Sobaka

Citation:
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 ?

Citation:
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 :
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.
Serge Tahé est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/10/2012, 16h15   #5
SoBaKa
Membre éclairé
 
Avatar de SoBaKa
 
Homme Grégory Houdremont
Développeur .NET
Inscription : juillet 2006
Messages : 225
Détails du profil
Informations personnelles :
Nom : Homme Grégory Houdremont
Âge : 28
Localisation : Belgique

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

Informations forums :
Inscription : juillet 2006
Messages : 225
Points : 303
Points : 303
Envoyer un message via MSN à SoBaKa
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
****** Formateur .Net
****** @Twitter
SoBaKa est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/10/2012, 16h22   #6
acesyde
Membre chevronné
 
Homme Pierre-Emmanuel Mercier
Ingénieur développement logiciels
Inscription : octobre 2006
Messages : 70
Détails du profil
Informations personnelles :
Nom : Homme Pierre-Emmanuel Mercier
Localisation : France, Gironde (Aquitaine)

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

Informations forums :
Inscription : octobre 2006
Messages : 70
Points : 671
Points : 671
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 :
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;}
 
}
acesyde est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/10/2012, 16h43   #7
SoBaKa
Membre éclairé
 
Avatar de SoBaKa
 
Homme Grégory Houdremont
Développeur .NET
Inscription : juillet 2006
Messages : 225
Détails du profil
Informations personnelles :
Nom : Homme Grégory Houdremont
Âge : 28
Localisation : Belgique

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

Informations forums :
Inscription : juillet 2006
Messages : 225
Points : 303
Points : 303
Envoyer un message via MSN à SoBaKa
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 :
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 :
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
****** Formateur .Net
****** @Twitter
SoBaKa est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/10/2012, 16h52   #8
acesyde
Membre chevronné
 
Homme Pierre-Emmanuel Mercier
Ingénieur développement logiciels
Inscription : octobre 2006
Messages : 70
Détails du profil
Informations personnelles :
Nom : Homme Pierre-Emmanuel Mercier
Localisation : France, Gironde (Aquitaine)

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

Informations forums :
Inscription : octobre 2006
Messages : 70
Points : 671
Points : 671
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
acesyde est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/10/2012, 16h57   #9
h2s84
Modérateur
 
Avatar de h2s84
 
Homme Holty Samba SOW
Développeur .NET
Inscription : mars 2007
Messages : 2 771
Détails du profil
Informations personnelles :
Nom : Homme Holty Samba SOW
Âge : 28
Localisation : Sénégal

Informations professionnelles :
Activité : Développeur .NET
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : mars 2007
Messages : 2 771
Points : 5 265
Points : 5 265
Envoyer un message via MSN à h2s84 Envoyer un message via Skype™ à h2s84
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)
__________________
Consultant .Net chez SoftFluent
Découvrir notre produit CodeFluent Entities

Adhérer à l'association Fier d'être développeur
Les FAQs sur les technologies .Net voir ici
Les cours et tutos sur les technologies .Net voir ici
Les critiques sur les livres parlant des technologies .Net voir ici
Pensez à la balise [CODE]
Pensez au tag si votre problème est résolu
h2s84 est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 18/10/2012, 17h03   #10
SoBaKa
Membre éclairé
 
Avatar de SoBaKa
 
Homme Grégory Houdremont
Développeur .NET
Inscription : juillet 2006
Messages : 225
Détails du profil
Informations personnelles :
Nom : Homme Grégory Houdremont
Âge : 28
Localisation : Belgique

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

Informations forums :
Inscription : juillet 2006
Messages : 225
Points : 303
Points : 303
Envoyer un message via MSN à SoBaKa
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
****** Formateur .Net
****** @Twitter
SoBaKa est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/10/2012, 20h46   #11
Nathanael Marchand
Rédacteur/Modérateur

 
Avatar de Nathanael Marchand
 
Homme Nathanael Marchand
Expert .Net So@t
Inscription : octobre 2008
Messages : 3 521
Détails du profil
Informations personnelles :
Nom : Homme Nathanael Marchand
Âge : 26
Localisation : France, Paris (Île de France)

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

Informations forums :
Inscription : octobre 2008
Messages : 3 521
Points : 7 961
Points : 7 961
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
Nathanael Marchand est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 19/10/2012, 08h22   #12
gcorbineau
Membre Expert
 
Homme Guillaume
Développeur .NET
Inscription : juillet 2006
Messages : 854
Détails du profil
Informations personnelles :
Nom : Homme Guillaume
Localisation : France, Loire Atlantique (Pays de la Loire)

Informations professionnelles :
Activité : Développeur .NET
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : juillet 2006
Messages : 854
Points : 1 296
Points : 1 296
Merci pour cette presentation
__________________
___________________________________________________________________________________________________________
Si mon message t'a aidé - Si au contraire, je suis hors sujet - Quand vous avez la réponse à votre question.
Est notre ami
gcorbineau est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/10/2012, 21h40   #13
durnambule
Futur Membre du Club
 
Inscription : janvier 2004
Messages : 53
Détails du profil
Informations forums :
Inscription : janvier 2004
Messages : 53
Points : 19
Points : 19
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 :
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
durnambule est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/10/2012, 10h53   #14
Serge Tahé
Nouveau Membre du Club
 
Inscription : avril 2009
Messages : 64
Détails du profil
Informations forums :
Inscription : avril 2009
Messages : 64
Points : 25
Points : 25
@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
Serge Tahé est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/10/2012, 13h21   #15
Luckyluke34
Membre éprouvé
 
Inscription : janvier 2011
Messages : 161
Détails du profil
Informations forums :
Inscription : janvier 2011
Messages : 161
Points : 433
Points : 433
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 :

Citation:
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.
Luckyluke34 est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 22/10/2012, 19h54   #16
Serge Tahé
Nouveau Membre du Club
 
Inscription : avril 2009
Messages : 64
Détails du profil
Informations forums :
Inscription : avril 2009
Messages : 64
Points : 25
Points : 25
@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.
Serge Tahé est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/10/2012, 09h17   #17
anthride
Membre du Club
 
Homme Claude Desvernes
Développeur .NET
Inscription : juillet 2005
Messages : 95
Détails du profil
Informations personnelles :
Nom : Homme Claude Desvernes
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 : 95
Points : 43
Points : 43
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
anthride est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/10/2012, 09h44   #18
Nathanael Marchand
Rédacteur/Modérateur

 
Avatar de Nathanael Marchand
 
Homme Nathanael Marchand
Expert .Net So@t
Inscription : octobre 2008
Messages : 3 521
Détails du profil
Informations personnelles :
Nom : Homme Nathanael Marchand
Âge : 26
Localisation : France, Paris (Île de France)

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

Informations forums :
Inscription : octobre 2008
Messages : 3 521
Points : 7 961
Points : 7 961
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 !
Nathanael Marchand est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/11/2012, 17h16   #19
iberserk
Expert Confirmé
 
Avatar de iberserk
 
Homme Bruno IGNACE
Architecte de base de données
Inscription : novembre 2004
Messages : 1 525
Détails du profil
Informations personnelles :
Nom : Homme Bruno IGNACE
Âge : 31
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 525
Points : 2 779
Points : 2 779
Envoyer un message via MSN à iberserk
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
iberserk est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/11/2012, 17h45   #20
Serge Tahé
Nouveau Membre du Club
 
Inscription : avril 2009
Messages : 64
Détails du profil
Informations forums :
Inscription : avril 2009
Messages : 64
Points : 25
Points : 25
@iberserk

Citation:
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.
Serge Tahé est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Actualité déjà publiée
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 03h01.


 
 
 
 
Partenaires

Hébergement Web