Table des matières
Démarrer un projet
Pour démarrer un projet utilisant Entity Framework 4 (avec l'approche Model first), il faut procéder ainsi :
- Démarrer un projet de type quelconque : Console, Windows Forms, ASP.NET, etc.
- Ajouter un élément au projet : ADO.NET Entity Data Model, ce qui donnera un fichier
.edmx
. - Développer le modèle Entités avec les relations.
- S'assurer que Pluralize New Objects soit à True dans les propriétés du modèle pour les collections d'entités aient des noms plurialisés (ex : une entité
Category
devientCategories
pour une collection).
- Une fois terminé, faire un clic droit sur un espace vide du modèle et choisir Generate Database from Model…, ce qui génère un script SQL pour créer les tables et les associations (ou contraintes) avec les clés primaires et étrangères.
- Exécuter le script SQL en se connectant à la base de données appropriée.
- Le script SQL peut être laissé dans le contrôle se sources (TFS, SVN, etc) pour que ce soit le DBA qui l'exécute.
Requêtes CRUD
LINQ-to-Entity ressemble à LINQ to SQL, mais n'utilise pas nécessairement les mêmes méthodes. Par exemple, le SingleOrDefault()
n'est pas utilisé. On utilise plutôt FirstOrDefault()
:
Employee employee = db.Employees.FirstOrDefault(b => b.Id == id);
Insérer
Pour « insérer » un objet, il suffit de le créer et de l'ajouter au contexte. L'inscription à la base de données se fera automatiquement.
BookLibraryEntities context = new BookLibraryEntities(); Book book = new Book { Title = "titre", Author = "John Doe", ISBN = "000-0000000" }; context.AddToBooks(book); context.SaveChanges();
Attacher et détacher des objets
Repository
Exemple de code qui se sert de Repository avec Entity Framework.
Interface
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Project.Models.Repositories { interface ICommandeRepository : IRepository { IList<Commande> ListAll(); IList<Commande> ListWaiting(); Commande GetByCommandNumber(int commandNumber); Commande GetById(int id); } }
Concret
using System; using System.Collections.Generic; using System.Linq; using System.Web; namespace Project.Models.Repositories { public class CommandeRepository : ICommandeRepository { private LivraisonExpressEntities _dataContext; public CommandRepository() { _dataContext = ProjectEntities.GetInstance(); } public IList<Command> ListAll() { var commands = from c in _dataContext.Commands select c; return commands.ToList(); } public IList<Command> ListWaiting() { var commands = from c in _dataContext.Commands where c.Statut == Command._WAITING select c; return commands.ToList(); } public Command GetByCommandNumber(int commandNumber) { var command = _dataContext.Commands.Where(c => c.Id == commandNumber).FirstOrDefault(); return command; } public Command GetById(int id) { var command = _dataContext.Commands.Where(c => c.Id == id).FirstOrDefault(); return command; } } }
Problèmes
ConnectionString entre projets
En essayant d'utiliser l'ObjectContext
d'un autre projet, il se peut qu'une erreur survienne :
The specified named connection is either not found in the configuration, not intended to be used with the EntityClient provider, or not valid.
Si la solution est divisée en plusieurs projets avec un projet ayant le modèle du domaine et le modèle d'Entity Framework, pour que les autres projets puissent utiliser celui-ci, il faut copier la configuration du <connectionStrings>
dans les autres fichiers de configuration Web.config
ou app.config
des autres projets.
<connectionStrings> <add name="DataEntities" connectionString="metadata=res://*/DataModel.csdl|res://*/DataModel.ssdl|res://*/DataModel.msl;provider=System.Data.SqlClient;provider connection string="Data Source=xxx;Initial Catalog=xxx;User Id=xxx;Password=xxx;MultipleActiveResultSets=True"" providerName="System.Data.EntityClient" /> </connectionStrings>
Suite à cette modification, il se peut qu'un autre type d'erreur survienne lors de l'exécution :
Configuration system failed to initialize
Il faut donc déplacer la section <connectionStrings>
ailleurs dans le fichier, probablement plus bas. La raison de ce problème est inconnu, mais ceci a réglé un problème rencontré.
Ressources
SQLite
- http://sqlite.phxsoftware.com/ (ADO.NET 2.0 / 3.5)