无法确定类型为“system . data . sqlite . sqlitefactory”的提供程序工厂的提供程序名

本文关键字:程序 工厂 sqlitefactory 类型 system sqlite data 无法确定 | 更新日期: 2023-09-27 18:06:13

我想在我的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 is 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=&quot;D:'MyWebAPI'src'MyWeb.Api'App_Data'sqlite_test.db&quot;" providerName="System.Data.SQLite.EF6" />
      </connectionStrings>
    </configuration>

    我可以通过visual studio工具中的"connect to database"连接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);
            }
        }

       public class ValuesController : ApiController
        {
            // GET api/values
            Sqlite ctx = new WebApi2Demo.Sqlite();
            public IEnumerable<Checksum> Get()
            {
                return ctx.Checksums;
            }
    	}

    无法确定类型为“system . data . sqlite . sqlitefactory”的提供程序工厂的提供程序名

    我自己得到了答案,但我仍然不知道根本原因,现在它工作了。我更改了webconfig,这是使我的项目工作的webconfig。

    我添加了一个"System.Data"提供程序。,请注意它的类型与System.Data.Sqlite.EF6相同

      <provider invariantName="System.Data.SQLite" type="System.Data.SQLite.EF6.SQLiteProviderServices, System.Data.SQLite.EF6" />
    

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

    这里是所有的配置。

     <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>
    

    这是一个超级棒的回答zhlicicho !

    另一个选项,除了将提供商和DbProviderFactories放到app.config或web中。

    Usings:

    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;
    

    配置类:

    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)));
        }
    }
    

    把它放在你的构造函数中:

    public PythonContext() : base($"name=pythonSource")
    {
        DbConfiguration.SetConfiguration(new SQLiteConfiguration());
    }
    

    我已经对这两种方法(这个和zhzhlicicho答案)运行了单元测试,我没有发现任何速度差异。

    调试输出(从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"...
    

    我对之前的答案投了赞成票,因为它对我有效,但这只是一个建议,如果你不想与你的配置杰克。~和平!

    sqlite entityframework