web-dev-qa-db-fra.com

Exemple simple d'utilisation de System.Data.SQLite avec Entity Framework 6

J'essaie d'obtenir un premier exemple de code simple pour travailler dans une application console utilisant SQLite et EF6, mais plusieurs erreurs se sont déjà produites: j'ai créé un nouveau projet de console dans VS 2015. Ensuite, installez EF (6.1.3) et System. Data.SQLite (1.0.102) via NuGet.

Essayez de lancer un programme simple:

namespace SQLiteConsole1
{
    class Person
    {
        public int Id { get; set; }
        public string Name { get; set; }
    }

    class MyContext : DbContext
    {
        public DbSet<Person> Persons { get; set; }
    }

    class Program
    {
        static void Main(string[] args)
        {
            using (var db = new MyContext())
            {
                var person = new Person() { Name = "John" };
                db.Persons.Add(person);
                db.SaveChanges();
            }
        }
    }
}

Voici à quoi ressemble mon App.Config:

  <connectionStrings>
    <add name="MyContext" connectionString="Data Source=C:\Temp\Test.sqlite" providerName="System.Data.SQLite" />
  </connectionStrings>
  <entityFramework>
    <defaultConnectionFactory type="System.Data.Entity.Infrastructure.SqlConnectionFactory, EntityFramework" />
    <providers>
      <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
      <provider invariantName="System.Data.SQLite.EF6" type="System.Data.SQLite.EF6.SQLiteProviderServices, System.Data.SQLite.EF6" />
    </providers>
  </entityFramework>
  <system.data>
    <DbProviderFactories>
      <remove invariant="System.Data.SQLite.EF6" />
      <add name="SQLite Data Provider (Entity Framework 6)" invariant="System.Data.SQLite.EF6" description=".NET Framework Data Provider for SQLite (Entity Framework 6)" type="System.Data.SQLite.EF6.SQLiteProviderFactory, System.Data.SQLite.EF6" />
    <remove invariant="System.Data.SQLite" /><add name="SQLite Data Provider" invariant="System.Data.SQLite" description=".NET Framework Data Provider for SQLite" type="System.Data.SQLite.SQLiteFactory, System.Data.SQLite" /></DbProviderFactories>
  </system.data>

Lorsque je lance ce programme pour la première fois, l'erreur suivante apparaît:

Exception non gérée: System.InvalidOperationException: aucun fournisseur Entity Framework trouvé pour le fournisseur ADO.NET avec le nom invariant 'System.Data.SQLite'. Assurez-vous que le fournisseur est enregistré dans la section 'entityFramework' du fichier de configuration de l'application. "

Alors je change <provider invariantName="System.Data.SQLite.EF6" à <provider invariantName="System.Data.SQLite", alors je reçois cette erreur:

Exception non gérée: System.Data.Entity.Infrastructure.DbUpdateException: une erreur s'est produite lors de la mise à jour des entrées. Voir l'exception interne pour plus de détails. System.Data.Entity.Core.UpdateException: une erreur s'est produite lors de la mise à jour des entrées. Voir l'exception interne pour plus de détails. System.Data.SQLite.SQLiteException: erreur de logique SQL ou base de données manquante pas de table de ce type: Contacts

Que faut-il changer pour que cet exemple simple fonctionne?

28
RaelB

Une question similaire est posée ici: Entity Framework 6 avec SQLite 3 Code First - Ne crée pas de tables

kjbartel donne une explication très utile que la création de table n'est pas prise en charge par le pilote EF SQLite.

Voir également https://github.com/msallin/SQLiteCodeFirst , qui constitue une excellente solution. J'ai installé le package SQLite.CodeFirst NuGet et ajouté le code ci-dessous, puis l'application fonctionne correctement:

    class MyContext : DbContext
    {
        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            var sqliteConnectionInitializer = new SqliteCreateDatabaseIfNotExists<MyContext>(modelBuilder);
            Database.SetInitializer(sqliteConnectionInitializer);
        }
        public DbSet<Person> Persons { get; set; }
    }
30
RaelB

Vous devez initialiser votre base de données avec les tables de vos modèles. Notez l’erreur "Erreur logique SQL ou absence de la base de données manquante dans la base de données: Personnes".

Cela signifie que vous devez exécuter SQL pour créer les tables correspondantes dans la base de données. Heureusement, si vous utilisez VS, dans le menu contextuel dans l'éditeur de modèle (fichiers * .edmx), il existe une option permettant de le générer automatiquement. et exécutez-le pour créer les entrées de table dans la base de données pour vous en fonction du modèle. Remarque: Parfois, les fichiers générés automatiquement pour une version autre que MS-SQL peuvent comporter des problèmes qui doivent être résolus manuellement avant la compilation/l'exécution.

0
Ben Abraham