我有一个程序,首先用实体框架代码创建数据库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);
}
}