[英]SQLite Entity Framework without App.config
對於3d-party應用程序插件,必須使用SQLite實體框架數據庫優先方法。 我搜索了所有的互聯網,包括添加沒有App.Config的DbProviderFactory , 使用Entity Framework 6和SQLite的問題等等。 我試圖以不同的方式和組合使用它們,但沒有任何幫助:
“mscorlib.dll中發生了'System.Data.Entity.Core.MetadataException'類型的未處理異常。附加信息:指定的模式無效。錯誤:AutosuggestModel.ssdl(2,2):錯誤0152:沒有實體框架提供程序在ADO.NET提供程序中找到了名為'System.Data.SQLite.EF6'的不變名。確保提供程序已在應用程序配置文件的'entityFramework'部分中注冊。“
解決方案中有一個測試控制台應用程序。 使用這個最小的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>
<entityFramework>
<providers>
<provider invariantName="System.Data.SQLite.EF6" type="System.Data.SQLite.EF6.SQLiteProviderServices, System.Data.SQLite.EF6" />
</providers>
</entityFramework>
<system.data>
<DbProviderFactories>
<add name="SQLite Data Provider" invariant="System.Data.SQLite" description=".NET Framework Data Provider for SQLite" type="System.Data.SQLite.SQLiteFactory, System.Data.SQLite" />
</DbProviderFactories>
</system.data>
</configuration>
連接字符串已在代碼中實現。 二手包是:
<?xml version="1.0" encoding="utf-8"?>
<packages>
<package id="EntityFramework" version="6.1.3" targetFramework="net452" />
<package id="System.Data.SQLite" version="1.0.98.1" targetFramework="net452" />
<package id="System.Data.SQLite.Core" version="1.0.98.1" targetFramework="net452" />
<package id="System.Data.SQLite.EF6" version="1.0.98.1" targetFramework="net452" />
<package id="System.Data.SQLite.Linq" version="1.0.98.1" targetFramework="net452" />
</packages>
請提供所有必需的代碼並指定插入位置。 提前致謝。
這是一個示例代碼,說明了如何實現目標。
namespace SqliteEFNoConfig
{
using System.Configuration;
using System.Data;
using System.Data.Common;
using System.Data.Entity;
using System.Data.Entity.Core.Common;
using System.Data.SQLite;
using System.Data.SQLite.EF6;
using System.Linq;
internal class Program
{
private static void Main()
{
// EF manages the connection via the DbContext instantiation
// connection string is set in config
// Use this code if you want to use a config file
// with only the connection string
//using (var model = new Model1())
//{
// var dbSetProperty = model.dbSetProperty.ToList();
//}
// Alternative method:
// Use this code if you don't want to use a config file
// You will also need to use the override constructor shown below,
// in your EF Model class
var connectionString = @"data source = {PathToSqliteDB}";
using (var connection = new SQLiteConnection(connectionString))
{
using (var model = new Model1(connection))
{
var dbSetProperty = model.dbSetProperty.ToList();
}
}
}
}
class SqliteDbConfiguration : DbConfiguration
{
public SqliteDbConfiguration()
{
string assemblyName = typeof (SQLiteProviderFactory).Assembly.GetName().Name;
RegisterDbProviderFactories(assemblyName );
SetProviderFactory(assemblyName, SQLiteFactory.Instance);
SetProviderFactory(assemblyName, SQLiteProviderFactory.Instance);
SetProviderServices(assemblyName,
(DbProviderServices) SQLiteProviderFactory.Instance.GetService(
typeof (DbProviderServices)));
}
static void RegisterDbProviderFactories(string assemblyName)
{
var dataSet = ConfigurationManager.GetSection("system.data") as DataSet;
if (dataSet != null)
{
var dbProviderFactoriesDataTable = dataSet.Tables.OfType<DataTable>()
.First(x => x.TableName == typeof (DbProviderFactories).Name);
var dataRow = dbProviderFactoriesDataTable.Rows.OfType<DataRow>()
.FirstOrDefault(x => x.ItemArray[2].ToString() == assemblyName);
if (dataRow != null)
dbProviderFactoriesDataTable.Rows.Remove(dataRow);
dbProviderFactoriesDataTable.Rows.Add(
"SQLite Data Provider (Entity Framework 6)",
".NET Framework Data Provider for SQLite (Entity Framework 6)",
assemblyName,
typeof (SQLiteProviderFactory).AssemblyQualifiedName
);
}
}
}
}
如果您決定不在配置文件中添加連接字符串,則需要在EF模型中添加以下構造函數。
public Model1(DbConnection connection)
: base(connection, true)
{
}
注意:以上代碼只是如何實現目標的示例,您必須根據需要進行調整。 假設您使用的是EF Code First方法,則提供上述代碼。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.