Auteur de questions
Sqlite avec Entity Framework 6 Code First

Question
-
Toutes les réponses
-
-
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.0Voici 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
-
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.
-
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
- Modifié Ismaiel AKKA lundi 15 décembre 2014 14:51
-
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
-
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="data source=JACKY-PC\SQLEXPRESS;initial catalog=LenomdemonfichierDbcontext;integrated security=True;MultipleActiveResultSets=True;App=EntityFramework"" 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
-
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
-
-
-
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
-
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) { }
-
-
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
-
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
-
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
-
-
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
- Modifié Ismaiel AKKA mercredi 17 décembre 2014 10:51
-
-
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
-
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>
-
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
-
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
-
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