web-dev-qa-db-ja.com

タイプ "System.Data.Sqlite.SqliteFactory"のプロバイダーファクトリのプロバイダー名を特定できません

Web APIプロジェクトでsqliteエンティティフレームワークを使用したいのですが、常にうまく機能しません。

これが私の開発環境です。

1. Visual Studio 2013、.net framework 4.5

  1. sqliteパッケージのバージョンは1.0.97です。パッケージの下にインストールしました

    system.data.sqlite、system.data.sqlite.ef6、system.data.sqlite.linq

  2. 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=&quot;D:\MyWebAPI\src\MyWeb.Api\App_Data\sqlite_test.db&quot;" providerName="System.Data.SQLite.EF6" />
  </connectionStrings>
</configuration>

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);
        }
    }
   public class ValuesController : ApiController
    {
        // GET api/values
        Sqlite ctx = new WebApi2Demo.Sqlite();
        public IEnumerable<Checksum> Get()
        {
            return ctx.Checksums;
        }
        }
20
zhnglicho

私は自分で答えを得ましたが、根本的な原因はまだわかりませんが、今はうまくいきます。 webconfigを変更しました。プロジェクトを機能させるwebconfigを次に示します。

「System.Data.Sqlite」というプロバイダーを追加しました。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>
50
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;

構成クラス:

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

私は両方の方法(この方法と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"...

以前の答えはうまくいきましたので、私は投票しましたが、これはあなたがあなたの設定でジャックしたくない場合の単なる提案です。 〜PEACE!

sqliteentityframework

3
PixelSyndicate