Outils pour utilisateurs

Outils du site


bases_de_donnees:sqlserver:entity_framework

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 devient Categories 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=&quot;Data Source=xxx;Initial Catalog=xxx;User Id=xxx;Password=xxx;MultipleActiveResultSets=True&quot;" 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

T4

bases_de_donnees/sqlserver/entity_framework.txt · Dernière modification : 2023/10/03 23:09 de sgariepy