SQLite EF6 programmatically set connection string at runtime

后端 未结 3 552
情话喂你
情话喂你 2020-12-05 00:51

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

相关标签:
3条回答
  • 2020-12-05 01:11

    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=&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" />
    

    change the above to following.(remove &quot ; 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;
        }
    
    0 讨论(0)
  • 2020-12-05 01:19

    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" />
    
    0 讨论(0)
  • 2020-12-05 01:28

    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)
    {
    }
    
    0 讨论(0)
提交回复
热议问题