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 :

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