代码之家  ›  专栏  ›  技术社区  ›  wondra

sqlite.codefirst“提供程序未返回ProviderManifest实例。”

  •  0
  • wondra  · 技术社区  · 6 年前

    我正试图使工作成为最简单的项目使用 SQLite.CodeFirst (1.5.1.25,从nuget包安装)以及 System.Data.SQLite (1.0.108,也是Nuget)。
    但是,添加一个人将导致

    提供程序未返回ProviderManifest实例。

    例外。 遗憾的是,没有官方的示例项目可以从中获得灵感,所以下面是几十个示例的集合,所以答案会让我遵循最少的示例。
    这个 context :

    class Person
    {
       [Key]
       public int ID { get; set; }
       public string Name { get; set; }
    }
    
    class MyDBContentext : DbContext
    {
        public MyDBContentext(string connectionString) 
               : base(new SQLiteConnection() { ConnectionString = connectionString }, true)
        { }
    
        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            var sqliteConnectionInitializer = new SqliteCreateDatabaseIfNotExists<MyDBContentext>(modelBuilder);
            System.Data.Entity.Database.SetInitializer(sqliteConnectionInitializer);
        }
    
        public DbSet<Person> People { get; set; }
    }
    
    //main
    var conStr = $"Data Source=eftest.sqlite;Version=3;Password=123;";
    var ctx = new MyDBContentext(conStr);
    ctx.People.Add(new Person() { Name = "foo" });//<--- exception throw here
    var res = ctx.SaveChanges();
    

    以及 App.config :

      <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" />
          <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" />
        </DbProviderFactories>
      </system.data>
      <entityFramework>
        <providers>
          <provider invariantName="System.Data.SQLite.EF6"
              type="System.Data.SQLite.EF6.SQLiteProviderServices, System.Data.SQLite.EF6" />
          <provider invariantName="System.Data.SqlClient"
              type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
          <provider invariantName="System.Data.SQLite"
              type="System.Data.SQLite.EF6.SQLiteProviderServices, System.Data.SQLite.EF6" />
        </providers>
      </entityFramework>
    

    如果有关联,也会有一个内部异常(已翻译,因为它忽略线程区域性):

    方法的尝试 system.data.sqlite.ef6.sqliteprovermanifest.getProvidermanifesttoken(system.string) 访问方法 system.data.sqlite.unsafenative methods.getsettingvalue(system.string, System.String)失败。

    2 回复  |  直到 5 年前
        1
  •  0
  •   wondra    6 年前

    重新安装所有nuget包(sqlite.codefirst、system.data.sqlite和entity framework)并清除解决方案解决了问题。

        2
  •  0
  •   Cem.S    5 年前

    对于将来出现此问题的用户,请从GAC中删除所有sqlite程序集。在我的例子中,我必须从具有管理权限的命令提示符运行以下内容:

    gacutil –u System.Data.SQLite
    gacutil –u System.Data.SQLite.Linq