none
Sqlite avec Entity Framework 6 Code First RRS feed

Toutes les réponses

  • Bonjour,

    Apparament Sqlite travaile avec Sql vous ne devriez pas avoir de problème pour l'utiliser.

    Bonne journée.

    Jacky


    Jbenon

    samedi 13 décembre 2014 10:09
  • Bonjour,

    J'ai posé la question, parce que j'ai voulu testé SQlite avev Entity Framework Code First 6.

    En intégrant la BD SQlite directement dans mon projet en l'ajoutant via ajout d'un élément existant, l'application fonctionne bien.

    Par contre, si je passe par une connectionString depuis App.config. l'application ne fonctionne pas du tout.

    Sachant que je travaille avec:

    - Framework 4.5.1
    - Entity Framework 6.1.1
    - System.Data.SQLite EF6(x86/x64) version 1.0.94.0

    Voici le fichier App.config généré par défaut:

    <?xml version="1.0" encoding="utf-8"?>
    <configuration>
      <configSections>
        <!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 -->
        <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"
                 requirePermission="false" />
      </configSections>
      <startup>
        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5.1" />
      </startup>
      <entityFramework>
        <defaultConnectionFactory type="System.Data.Entity.Infrastructure.LocalDbConnectionFactory, EntityFramework">
          <parameters>
            <parameter value="v11.0" />
          </parameters>
        </defaultConnectionFactory>
        <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>
        <!--
            NOTE: The extra "remove" element below is to prevent the design-time
                  support components within EF6 from selecting the legacy ADO.NET
                  provider for SQLite (i.e. the one without any EF6 support).  It
                  appears to only consider the first ADO.NET provider in the list
                  within the resulting "app.config" or "web.config" file.
        -->
        <DbProviderFactories>
          <remove invariant="System.Data.SQLite" />
          <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" />
        </DbProviderFactories>
      </system.data>
    </configuration>

    Et voici le fichier App.config après ajout de la connectionString:

    <?xml version="1.0" encoding="utf-8"?>
    <configuration>
      <configSections>
        <!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 -->
        <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"
                 requirePermission="false" />
      </configSections>
      <startup>
        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5.1" />
      </startup>
      <entityFramework>
        <defaultConnectionFactory type="System.Data.Entity.Infrastructure.LocalDbConnectionFactory, EntityFramework">
          <parameters>
            <parameter value="v11.0" />
          </parameters>
        </defaultConnectionFactory>
        <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>
        <!--
            NOTE: The extra "remove" element below is to prevent the design-time
                  support components within EF6 from selecting the legacy ADO.NET
                  provider for SQLite (i.e. the one without any EF6 support).  It
                  appears to only consider the first ADO.NET provider in the list
                  within the resulting "app.config" or "web.config" file.
        -->
        <DbProviderFactories>
          <remove invariant="System.Data.SQLite" />
          <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" />
        </DbProviderFactories>
      </system.data>
      <connectionStrings>
        <clear />
        <add name="SqliteConnectionString" connectionString="Data Source=C:\Users\Noussy\Desktop\ProjetsCSharp\TestORM\MyDataBases\Course.sqlite" providerName="System.Data.SQLite.EF6" />
      </connectionStrings>
    </configuration>

    Voici le DbContext:

    using System;
    using System.Collections.Generic;
    using System.Data.Entity;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;

    namespace SQliteWithEFCodeFirstSample
    {
        public class CoursesContext : DbContext
        {
            public CoursesContext() : base("SqliteConnectionString")
            {
                Database.SetInitializer<CoursesContext>(new CreateDatabaseIfNotExists<CoursesContext>());
            }

            public DbSet<Course> Courses { get; set; }
            public DbSet<Student> Students { get; set; }
        }
    }

    Et voici le message d'erreur quand je lance l'application:

    Unable to determine the provider name for provider factory of type 'System.Data.SQLite.SQLiteFactory'. Make sure that the ADO.NET provider is installed or registered in the application config.

    Bien à vous.


    Beel

    dimanche 14 décembre 2014 12:12
  • bonjour,

    Voici la réponse à partir de stackoverlow :

    Unfortunately, the EF6 provider implementation in System.Data.SQLite.EF6 doesn't currently support creating tables. I ran into the same problem so downloaded the SQLite source code to have a look but couldn't find anything for creating tables. Similarly there's nothing there for migrations. The EF6 stuff is based off of their Linq implmentation so it's all aimed at querying the database rather than modifying it.

    I considered trying to modify the code to get it working but figured it was too much effort and easy enough to just simply include a resource with the needed sql for generating the tables executed with an SQLiteCommand. It sure kills the code first work flow though. I instead used SQL Server Express for development and generated an SQL script file (with modifications) for generating the SQLite database.

    If there's a proper answer to this I'd also love to hear it.

    lundi 15 décembre 2014 14:49
  • bonjour,

    vous pouvez aussi essayer ça :

    http://hintdesk.com/sqlite-with-entity-framework-code-first-and-migration/

    ou

    http://blog.devart.com/entity-framework-6-support-for-oracle-mysql-postgresql-sqlite-and-salesforce.html

    lundi 15 décembre 2014 14:50
  • Bonjour,

    Merci pour votre réponse.

    Pour le premier lien, je sais comment lancer les commandes de migrations sous Nuget, mais je vous avoue que pour un débutant comme moi, je ne saisi pas très bien la partie avec la migration dans la méthode Intialize() et la classe CourseraContextHelper.

    Pour le deuxième lien, j'ai test é leur solution mais ça bloque aussi avec la connectionString.

    Bien à vous.


    Beel

    lundi 15 décembre 2014 15:18
  • Bonjour,

    Voici un exemple de chaîne de connexion pour un serveur qui fonctionne avec EF 6 et un data-service.

     <connectionStrings>
        <add name="DefaultConnection" providerName="System.Data.SqlClient" connectionString="Data Source=(LocalDb)\v11.0;Initial Catalog=aspnet-EasyGesbatServer-20141115223046;Integrated Security=SSPI;AttachDBFilename=|DataDirectory|\aspnet-EasyGesbatServer-20141115223046.mdf" />
        <add name="lenomdemesentitésfichierEdmx" connectionString="metadata=res://*/EasyGesbat.csdl|res://*/EasyGesbat.ssdl|res://*/EasyGesbat.msl;provider=System.Data.SqlClient;provider connection string=&quot;data source=JACKY-PC\SQLEXPRESS;initial catalog=LenomdemonfichierDbcontext;integrated security=True;MultipleActiveResultSets=True;App=EntityFramework&quot;" providerName="System.Data.EntityClient" />
      </connectionStrings>

    Si vous ne trouvez pas , il faut me préciser si vous travaillez sur une application cliente(appli windows) ou sur une page webform, car l'appel des données est différent, et la configuration aussi.

    Vous remarquerez dans votre code une connexion defaultConnectionFactory c'est ici que l'on configure pour l'appli cliente.

    Votre erreur vous répond qu'il n"y a pas de Provider SQLiteFactory, le provider étant la passerelle d'accés il faut essayer avec le provider sql, la plupart du temps il s'adapte tout seul quand il reconnait les données. Sinon il faut importer votre provider dans votre application au même titre que la base de données.

    Pour le Database.SetInitializer il ne sert qu' ajouter des enregistrements dans la bd avant sa création.

    Pour generer une bd lorsque vous avez vos classes, il faut ajouter les migrations, puis generer votre projet, puis vous faite :

    update-database -verbose

    la base va se créer si aucune erreur de structure n'est rencontrée, et vous aurez votre base SQL.

    Bon courage.

    Cordialement

    Jacky


    Jbenon

    mardi 16 décembre 2014 09:06
  • Bonjour,

    Tout d'abord merci pour votre réponse. Et pour répondre à votre question,  mon application pour l'instant s'exécute sur mon poste local, il n' y a pas encore la notion de client-serveur.

    Sur base du code que j'ai posté ci-dessus, j'ai une application console qui va essayer d'enregistrer des données dans une DB SQLite préalablement crée que j'ai placé dans un répertoire donné. En en lançant l'application, normalement le DbContext va essayer d'établir la connexion avec cette base de données via la connectionString que j'ai mentionné dans le fichier App.config.

    Rem:
    Sur le même principe, ça fonctionne très bien avec SqlServeur.Mais pas avec SQLite.


    Beel


    • Modifié beela mardi 16 décembre 2014 09:39
    mardi 16 décembre 2014 09:36
  • Bonjour,

    Essaye ça :

    https://damienbod.wordpress.com/2013/11/18/using-sqlite-with-entity-framework-6-and-the-repository-pattern/

    mardi 16 décembre 2014 10:31
  • Bonjour,

    Essaye ça :

    https://damienbod.wordpress.com/2013/11/18/using-sqlite-with-entity-framework-6-and-the-repository-pattern/

    mardi 16 décembre 2014 10:32
  • Bonjour,

    Mise à part, la difficulté pour moi de comprendre cette implémentation avec le repository pattern. L'exemple que vous m'avez passé propose d'inclure la DB SQLite dans le projet même ne pose de problème car je l''ai testé  et ça fonctionne bien. Or, mon problème c'est lorsque la DB SQLite se trouve en dehors du projet. C'est à dire dans un répertoire donné et que je la renseigne dans la connectionString.

    Bien à vous.


    Beel

    mardi 16 décembre 2014 11:28
  • hi,

    try this :

    I found a workaround by using a different constructor from the base DbContext class:

    public DbContext(DbConnection existingConnection, bool contextOwnsConnection);

    Using this override you can pass an SQLiteConnection instead which you set the connection string on. So for example you can add a new constructor to your FirmwareContext.

    public FirmwareContext(string connectionString)
        : base(new SQLiteConnection() { ConnectionString = connectionString }, true)
    {
    }

    Or even

    public FirmwareContext(string filename)
        : base(new SQLiteConnection() { ConnectionString =
                new SQLiteConnectionStringBuilder()
                    { DataSource = filename, ForeignKeys = true }
                .ConnectionString }, true)
    {
    }

    mardi 16 décembre 2014 12:56
  • hi,

    you can try this also :

    https://damienbod.wordpress.com/2013/11/14/using-sqlite-with-net/

    mardi 16 décembre 2014 12:59
  • Bonsoir,

    Essaye d'ajouter un fichier extension EDMX il va te demander si tu veux utiliser une base existante, tu coche ensuite tu ira chercher ta base à son emplacement, comme il va se connecter tout seul, il  va générer la chaîne de connexion ou te préciser qu'il a un problème. Le fichier est indispensable pour travailler avec un service, tu devrais réussir facilement avec, et on sera sur de ta connexion si ce fichier fonctionne, il va se remplir avec tes classes. 

    Jacky


    Jbenon

    mardi 16 décembre 2014 23:11
  • Bonjour,

    Juste pour rappeler que j'ai crée mon projet avec EF Code First.

    Pour la solution que vous m'avez proposé, voilà ce que j'ai fait en détail:

    1) Click droit sur le projet
    2) Ajout d'un élément existant
    3) Sélection de Ado.Net Entity Data Model
    4) Im me propose 4 choix:
        - EF Designer from database
        - Empty EF Designer model
        - Empty Code First model
        - Code First from database
    5) Je sélectionne le 4ème choix
    6) à la page " Chose your data connection", je sélectionne la BD SQLite
    7) puis à l'écran suivant , il me propose de choisir la version d"EF:
     - Entity Framework 6.X est désactive, et il y a un message d'erreur suivant et je ne peux pas aller plus loin:
    Your Projetc references the last version of EF; however, an EF database provider compatible with this version could not be found for your data connection. If you have already installed a compatible provider, ensure you have rebuilt your project before performing this action. Otherwize, exit this wizard, install a compatible provider, and rebuild your projetc before performing this action.

    Bien à vous.


    Beel

    mercredi 17 décembre 2014 08:35
  • Bonjour,

    "Your Projetc references the last version of EF; however, an EF database provider compatible with this version could not be found for your data connection"

    LA version 6 de Entity framework n'est pas supporté :(

    changer la version. Utiliser EF4 ou 5

    mercredi 17 décembre 2014 09:17
  • Bonjour,

    Pour revenir à une version antérieure d'EF, il faut que je passe à une version antérieure du Framework.

    Je vais quand même essayer, pour ne fus ce que voir!


    Beel

    mercredi 17 décembre 2014 09:50
  • Nn c'est pas nécéssaire vue que la version EF5 par exemple tourne bien sur la meme version du freamwork que EF6.X

    Et vous pouvez vérifier.

    http://msdn.microsoft.com/en-us/data/jj574253.aspx

    https://entityframework.codeplex.com/wikipage?title=specs

    mercredi 17 décembre 2014 10:49
  • Après, tests, il y a des problèmes d’incompatibilité des versions entre SQLite, EF 5, Framework 4,

    Beel

    mercredi 17 décembre 2014 11:06
  • Oubliez EF et essayer cette alternative :

    https://code.msdn.microsoft.com/Demo-of-ADONET-POCO-with-140ad3ad

    ADO.NET avec un model.

    vous pouvez régler le problème d'accès à sqlite

    ou essayez ça :

    http://bricelam.net/2012/10/entity-framework-on-sqlite.html

    mercredi 17 décembre 2014 13:08
  • Ou bien essayez ce lien :

    http://brice-lambson.blogspot.be/2012/10/entity-framework-on-sqlite.html

    avec cette configuration "App.config"

    <?xml version="1.0" encoding="utf-8"?>
    <configuration>
      <configSections>
        <!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 -->
        <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=5.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
      </configSections>
      <startup>
        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
      </startup>
      <system.data>
        <DbProviderFactories>
          <add name="SQLite Data Provider" invariant="System.Data.SQLite" description="Data Provider for SQLite" type="System.Data.SQLite.SQLiteFactory, System.Data.SQLite" />
        </DbProviderFactories>
      </system.data>
      <connectionStrings>
        <add name="EasyInvoiceContext" connectionString="Data Source=|DataDirectory|Database/EasyInvoice_v1.sqlite" providerName="System.Data.SQLite" />
      </connectionStrings>
      <entityFramework>
        <defaultConnectionFactory type="System.Data.Entity.Infrastructure.LocalDbConnectionFactory, EntityFramework">
          <parameters>
            <parameter value="v11.0" />
          </parameters>
        </defaultConnectionFactory>
      </entityFramework>
    </configuration>
    mercredi 17 décembre 2014 13:11
  • Bonsoir,

    Par expérience personnelle, surtout avec Ef, Lorsque que vous commencez à insatller des mises à jours avec Nugets, vous devez toujours continuer pour tous les composants, les Nugets vérifient les compatibilités et mettent uniquement ceux qui sont reconnus à jours. Ef ne fonctionne plus si vous avez des éléments non compatibles entre eux. Avez-vous ajouté toutes les réf nécessaires à EF.

    Pour ajouter un fichier Edmx, il faut faire Ajouter sur le projet nouvel élément, selectionner Données, normalement il est le premier et se nomme : Ado.net Entity Data model

    Jacky


    Jbenon

    mercredi 17 décembre 2014 20:43
  • Bonjour,

    Voilà, j'ai installer EF 5, mais en installant le package SQLite sous Nuget, ce dernier désinstalle la version 5 d'EF et installe la version 6 automatiquement. Et, donc finalement avec la version 6, il n' y a pas moyen de tester votre solution comme je l'ai expliqué ci-dessous.

    Je pense que je n'ai pas de choix que d'intégrer le fichier SQLite dans mon projet. Ou, alors je pense à une autre solution, et je ne sais pas si vous auriez vous un exemple d'implémentation d'une Factory qui peut renvoyer une connexion au DBContext en fonction du type de fournisseur de BD ?

    Bien à vous.


    Beel

    jeudi 18 décembre 2014 07:41
  • Bonjour,

    Voilà, à force de persévérer on fini par trouver.

    En fait le problème vient du fait que DbContext (EF Code First) ne crée pas la BD SQLite. Il faut que celle ci-soit créé préalablement avant de pouvoir l'exploiter.

    Donc, on sait passé une connectionString au DbContext, mais la méthode SetInitilazer doit recevoir comme paramètre Null pour que cela fonctionne. Sinon, si on essaye de lui passer CreateDatabaseIfNotExists ou DropCreateDatabaseWhenModelChanges ou DropCreateDatabaseAlways, l'application plante.

    Pas si évident à deviner !

    Bien à vous.





    Database.SetInitializer<CoursesContext>(null);
    


    Beel

    jeudi 18 décembre 2014 14:54