设置SQL的提供程序(DbConfiguration)



我有一个程序,首先用实体框架代码创建数据库SQL。

我正在添加创建Sqlite数据库的可能性,但这需要添加一个提供程序。

public class Configuration : DbConfiguration, IDbConnectionFactory
{
public Configuration()
{
SetProviderFactory("System.Data.SQLite", SQLiteFactory.Instance);
SetProviderFactory("System.Data.SQLite.EF6", SQLiteProviderFactory.Instance);
var providerServices = (DbProviderServices)SQLiteProviderFactory.Instance.GetService(typeof(DbProviderServices));
SetProviderServices("System.Data.SQLite", providerServices);
SetProviderServices("System.Data.SQLite.EF6", providerServices);
SetDefaultConnectionFactory(this);
}
public DbConnection CreateConnection(string connectionString)
=> new SQLiteConnection(connectionString);
}

现在,当我尝试创建SQL数据库时,我会遇到错误:

当前命令出现严重错误。如果有的话,应该丢弃。

错误源:

.Net SqlClient数据提供程序

根据我所读的内容,SetDefaultConnectionFactory(this);更改了默认配置。但我在任何地方都找不到SQL数据库的提供者。

using (var context = CreateContext())
{
InitializeAndUpgradeDatabase(context);
}
public DeviceModelContext CreateContext()
{
return new DeviceModelContext(connectionString);
}
public static void InitializeAndUpgradeDatabase(DbContext context)
{
if (context.Database.Exists())
return;
try
{
context.Database.CreateIfNotExists();
}
catch (Exception e)
{
throw;
}
}

它在OnModelCreating(DbModelBuilder modelBuilder)之后在context.Database.CreateIfNotExists()中抛出错误

问题是它创建了allways配置实例,并且allways设置了SqlLite提供程序。

我的解决方案:

public class Configuration : DbConfiguration, IDbConnectionFactory
{
public SqlTypeEnum sqlTypeEnum = SqlTypeEnum.Sql;
public Configuration()
{
SetDefaultConnectionFactory(this);
}
public Configuration(SqlTypeEnum sqlTypeEnum)
{
this.sqlTypeEnum = sqlTypeEnum;
SetProviderFactory("System.Data.SQLite", SQLiteFactory.Instance);
SetProviderFactory("System.Data.SQLite.EF6", SQLiteProviderFactory.Instance);
var providerServices = (DbProviderServices)SQLiteProviderFactory.Instance.GetService(typeof(DbProviderServices));
SetProviderServices("System.Data.SQLite", providerServices);
SetProviderServices("System.Data.SQLite.EF6", providerServices);
SetDefaultConnectionFactory(this);
}
public DbConnection CreateConnection(string connectionString)
{
if(sqlTypeEnum == SqlTypeEnum.Sql)
return new SqlConnection(connectionString);
else
return new SQLiteConnection(connectionString);
}
}

最新更新