I try to migrate form EF 3.5 to 6 (with SQLite as database). We can not set the connection string in the app config file (this works without problems with ef6). We have to s
Normally the connection string in config would look like this
<add name="MuthootOneClientEntities" connectionString="metadata=res://*/LocalData.MuthootClientContext.csdl|res://*/LocalData.MuthootClientContext.ssdl|res://*/LocalData.MuthootClientContext.msl;provider=System.Data.SQLite;provider connection string="data source=D:\LocalRepo\trunk\dev\Muthoot.MuthootOne.API\src\Muthoot.MuthootOne.API.Services\LocalData\FD1CBA65-1B68-449F-8E6D-A652137466D4.db"" providerName="System.Data.EntityClient" />
change the above to following.(remove " ; to "") and mention it directly in entity context connection string with your own database location.
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;
}
After looking at this further it seems the problem is that there isn't a IDbConnectionFactory defined for SQLite. So another approach would be to define your own factory implementation.
public class SQLiteConnectionFactory : IDbConnectionFactory
{
public DbConnection CreateConnection(string connectionString)
{
return new SQLiteConnection(connectionString);
}
}
Then replace the defaultConnectionFactory
entry in your 'app.config' with something like:
<defaultConnectionFactory type="MyDAL.SQLiteConnectionFactory, MyDAL" />
I was having the same problem. 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)
{
}