framework entityframework data .net sqlite runtime entity-framework-6 connection-string

.net - entityframework - sqlite entity framework 6



SQLite EF6 configura programáticamente la cadena de conexión en tiempo de ejecución (3)

Después de ver esto más, parece que el problema es que no hay una IDbConnectionFactory definida para SQLite. Entonces, otro enfoque sería definir su propia implementación de fábrica.

public class SQLiteConnectionFactory : IDbConnectionFactory { public DbConnection CreateConnection(string connectionString) { return new SQLiteConnection(connectionString); } }

Luego reemplace la entrada defaultConnectionFactory en su ''app.config'' con algo como:

<defaultConnectionFactory type="MyDAL.SQLiteConnectionFactory, MyDAL" />

Intento migrar el formulario EF 3.5 a 6 (con SQLite como base de datos). No podemos establecer la cadena de conexión en el archivo de configuración de la aplicación (esto funciona sin problemas con ef6). Tenemos que establecer la cadena de conexión programáticamente en tiempo de ejecución (después de que el usuario haya seleccionado el archivo SQLite).

Aquí está nuestra 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=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" /> </configSections> <connectionStrings> <add name="testContext" connectionString="data source=Data/testdb.sqlite;Foreign Keys=True" providerName="System.Data.SQLite" /> </connectionStrings> <entityFramework> <defaultConnectionFactory type="System.Data.Entity.Infrastructure.LocalDbConnectionFactory, EntityFramework"> <parameters> <parameter value="v11.0" /> </parameters> </defaultConnectionFactory> <providers> <provider invariantName="System.Data.SQLite" type="System.Data.SQLite.EF6.SQLiteProviderServices, System.Data.SQLite.EF6" /> </providers> </entityFramework> <system.data> <DbProviderFactories> <remove invariant="System.Data.SQLite" /> <remove invariant="System.Data.SQLite.EF6" /> <add name="System.Data.SQLite" invariant="System.Data.SQLite" description=".Net Framework Data Provider for SQLite (Entity Framework 6)" type="System.Data.SQLite.EF6.SQLiteProviderFactory, System.Data.SQLite.EF6" /> </DbProviderFactories> </system.data> </configuration>

Aquí está el DbContext

public class FirmwareContext : DbContext { public FirmwareContext() : this(DEFAULT_CONNECTION) { } public FirmwareContext(string connextionNameOrString) : base(connextionNameOrString) { } }

Si me conecto con el nombre de conexión de app.config, todo funciona sin problemas. Si intento pasar la cadena de conexión con el segundo constructor, esto falla

Aquí hay un pequeño ejemplo.

SQLiteConnectionStringBuilder builder = factory.CreateConnectionStringBuilder() as SQLiteConnectionStringBuilder; builder.DataSource = dataSource; // Path to file name of the user builder.ForeignKeys = true; var context = new FirmwareContext(builder.ToString()); var context = new FirmwareContext(builder.ToString()); var test = context.Firmware.FirstOrDefault();

Obtuve la siguiente excepción ("Schlüsselwort wird nicht unterstützt: ''claves foráneas''.") => La clave ''clave foránea'' no es compatible. Si elimino el conjunto de claves externas, obtuve la siguiente excepción ("El proveedor no devolvió una cadena ProviderManifestToken") y algunas excepciones internas.

Parece que bas (connectionString) construye la cadena de conexión MSSQL y para SQLite.

¿Cómo puedo hacer que mi segundo constructor sea compatible con sqlite?


Estaba teniendo el mismo problema. Encontré una solución alternativa utilizando un constructor diferente de la clase base DbContext:

public DbContext(DbConnection existingConnection, bool contextOwnsConnection);

Usando este reemplazo, puede pasar una conexión de SQLite en la cual usted establece la cadena de conexión. Así, por ejemplo, puede agregar un nuevo constructor a su FirmwareContext.

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

O incluso

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


Normalmente la cadena de conexión en la configuración se vería así.

<add name="MuthootOneClientEntities" connectionString="metadata=res://*/LocalData.MuthootClientContext.csdl|res://*/LocalData.MuthootClientContext.ssdl|res://*/LocalData.MuthootClientContext.msl;provider=System.Data.SQLite;provider connection string=&quot;data source=D:/LocalRepo/trunk/dev/Muthoot.MuthootOne.API/src/Muthoot.MuthootOne.API.Services/LocalData/FD1CBA65-1B68-449F-8E6D-A652137466D4.db&quot;" providerName="System.Data.EntityClient" />

cambie lo anterior a siguiente. (elimine & quot; a "") y mencionelo directamente en la cadena de conexión del contexto de la entidad con su propia ubicación de base de datos.

public partial class MuthootClientEntities : DbContext { public MuthootClientEntities() : base(@"metadata=res://*/LocalData.MuthootClientContext.csdl|res://*/LocalData.MuthootClientContext.ssdl|res://*/LocalData.MuthootClientContext.msl;provider=System.Data.SQLite;provider connection string=""data source=" + System.Environment.CurrentDirectory + @"/LocalData/FD1CBA65-1B68-449F-8E6D-A652137466D4.db""") { var test = System.Environment.CurrentDirectory; }