zhn*_*cho 20 c# sqlite entity-framework entity-framework-6 visual-studio-2013
我想在我的web api项目中使用sqlite实体框架,但它始终无法正常工作,
这是我的发展环境.
1.Visual studio 2013,.net framework 4.5
sqlite包版本是1.0.97,我安装在下面的包中
system.data.sqlite,system.data.sqlite.ef6,system.data.sqlite.linq
EntityFramework是6.1.3
这是我得到的例外
无法确定"System.Data.SQLite.SQLiteFactory"类型的提供程序工厂的提供程序名称.确保在应用程序配置中安装或注册了ADO.NET提供程序
这是我的webconfig
<configuration>
<configSections>
<section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
<!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 -->
</configSections>
<entityFramework>
<defaultConnectionFactory type="System.Data.Entity.Infrastructure.LocalDbConnectionFactory, EntityFramework">
<parameters>
<parameter value="mssqllocaldb" />
</parameters>
</defaultConnectionFactory>
<providers>
<provider invariantName="System.Data.SQLite.EF6" type="System.Data.SQLite.EF6.SQLiteProviderServices, System.Data.SQLite.EF6" /> <!--type="System.Data.SQLite.EF6.SQLiteProviderServices-->
</providers>
</entityFramework>
<system.data>
<DbProviderFactories>
<remove invariant="System.Data.SQLite.EF6" />
<add name="SQLite Data Provider (Entity Framework 6)" invariant="System.Data.SQLite.EF6" description=".NET Framework Data Provider for SQLite (Entity Framework 6)" type="System.Data.SQLite.EF6.SQLiteProviderFactory, System.Data.SQLite.EF6" />
</DbProviderFactories>
</system.data>
<connectionStrings>
<add name="Sqlite" connectionString="data source="D:\MyWebAPI\src\MyWeb.Api\App_Data\sqlite_test.db"" providerName="System.Data.SQLite.EF6" />
</connectionStrings>
</configuration>Run Code Online (Sandbox Code Playgroud)
我可以通过visual studio工具中的"连接数据库"连接sqlite数据库文件,我也可以先用代码生成实体.
但我无法获得数据正常
这是我的代码
public partial class Sqlite : DbContext
{
public Sqlite()
: base("name=Sqlite")
{
}
public virtual DbSet<AuthorizationLog> AuthorizationLogs { get; set; }
public virtual DbSet<Checksum> Checksums { get; set; }
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<AuthorizationLog>()
.Property(e => e.ClientKey)
.IsUnicode(false);
modelBuilder.Entity<AuthorizationLog>()
.Property(e => e.Login)
.IsUnicode(false);
modelBuilder.Entity<AuthorizationLog>()
.Property(e => e.Password)
.IsUnicode(false);
modelBuilder.Entity<AuthorizationLog>()
.Property(e => e.ConnectionString)
.IsUnicode(false);
}
}Run Code Online (Sandbox Code Playgroud)
public class ValuesController : ApiController
{
// GET api/values
Sqlite ctx = new WebApi2Demo.Sqlite();
public IEnumerable<Checksum> Get()
{
return ctx.Checksums;
}
}Run Code Online (Sandbox Code Playgroud)
zhn*_*cho 50
我自己得到了答案,但我仍然不知道根本原因,现在它有效.我更改了webconfig,这是使我的项目工作的webconfig.
我添加了一个名为"System.Data.Sqlite"的提供程序,请注意其类型与System.Data.Sqlite.EF6相同
<provider invariantName="System.Data.SQLite" type="System.Data.SQLite.EF6.SQLiteProviderServices, System.Data.SQLite.EF6" />
Run Code Online (Sandbox Code Playgroud)
<add name="SQLite Data Provider" invariant="System.Data.SQLite" description=".NET Framework Data Provider for SQLite" type="System.Data.SQLite.SQLiteFactory, System.Data.SQLite" />
<remove invariant="System.Data.SQLite.EF6" />
Run Code Online (Sandbox Code Playgroud)
这是所有配置.
<entityFramework>
<providers>
<provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
<provider invariantName="System.Data.SQLite.EF6" type="System.Data.SQLite.EF6.SQLiteProviderServices, System.Data.SQLite.EF6" />
<provider invariantName="System.Data.SQLite" type="System.Data.SQLite.EF6.SQLiteProviderServices, System.Data.SQLite.EF6" />
</providers>
</entityFramework>
<system.data>
<DbProviderFactories>
<remove invariant="System.Data.SQLite" />
<add name="SQLite Data Provider" invariant="System.Data.SQLite" description=".NET Framework Data Provider for SQLite" type="System.Data.SQLite.SQLiteFactory, System.Data.SQLite" />
<remove invariant="System.Data.SQLite.EF6" />
<add name="SQLite Data Provider (Entity Framework 6)" invariant="System.Data.SQLite.EF6" description=".NET Framework Data Provider for SQLite (Entity Framework 6)" type="System.Data.SQLite.EF6.SQLiteProviderFactory, System.Data.SQLite.EF6" />
</DbProviderFactories>
</system.data>
Run Code Online (Sandbox Code Playgroud)
Pix*_*ate 14
这是一个超级棒的回答zhnglicho!
除了将提供者和 DbProviderFactories 放入 app.config 或 web.config 之外,另一种选择是编码您的 ProviderFactories 并在您的 DbContext 实现中使用它。
用途:
using System.Data.Entity;
using System.Data.Entity.Core.Common;
using System.Data.Entity.ModelConfiguration.Conventions;
using System.Data.SQLite;
using System.Data.SQLite.EF6;
Run Code Online (Sandbox Code Playgroud)
配置类:
public class SQLiteConfiguration : DbConfiguration
{
public SQLiteConfiguration()
{
SetProviderFactory("System.Data.SQLite", SQLiteFactory.Instance);
SetProviderFactory("System.Data.SQLite.EF6", SQLiteProviderFactory.Instance);
SetProviderServices("System.Data.SQLite", (DbProviderServices)SQLiteProviderFactory.Instance.GetService(typeof(DbProviderServices)));
}
}
Run Code Online (Sandbox Code Playgroud)
把它放在你的构造函数中:
public PythonContext() : base($"name=pythonSource")
{
DbConfiguration.SetConfiguration(new SQLiteConfiguration());
}
Run Code Online (Sandbox Code Playgroud)
我已经针对这两种方法(这个方法和 zhnglicho 答案)运行了单元测试,但我没有发现任何速度差异。
调试输出(从 sqlitedb 获取记录计数和随机引用):
Found 18307 Records
Presenter: 'And Miles Yellowbird, up high in banana tree, the golfer and
inventor of Catholicism.'
Debug Trace:
Native library pre-loader is trying to load native SQLite library "C:\Users\***\***\\SQLiteTests\bin\Debug\x64\SQLite.Interop.dll"...
Run Code Online (Sandbox Code Playgroud)
我对之前的答案投了赞成票,因为它对我有用,但这只是一个建议,如果您不想使用您的配置。~和平!
| 归档时间: |
|
| 查看次数: |
16385 次 |
| 最近记录: |