c# - framework - No se puede determinar el nombre del proveedor para la fábrica del proveedor de tipo "System.Data.Sqlite.SqliteFactory"
entity framework code first existing database (2)
Quiero usar el marco de la entidad sqlite en mi proyecto de api web, pero siempre no puede funcionar bien,
Aquí está mi entorno de desarrollo.
1.Visual studio 2013, .net framework 4.5
La versión del paquete sqlite es 1.0.97, instalé debajo de los paquetes
system.data.sqlite, system.data.sqlite.ef6, system.data.sqlite.linq
EntityFramework es 6.1.3
Aquí es la excepción que tengo
No se puede determinar el nombre del proveedor para la fábrica de proveedores de tipo ''System.Data.SQLite.SQLiteFactory''. Asegúrese de que el proveedor ADO.NET esté instalado o registrado en la configuración de la aplicación
Aquí está mi 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>
Puedo conectar el archivo de base de datos sqlite a través de "conectar a la base de datos" en la herramienta de Visual Studio. También puedo generar la entidad utilizando el código primero.
pero no puedo obtener datos normales
Aqui esta mi codigo
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;
}
}
Esa fue una super gran respuesta zhnglicho!
Otra opción, además de colocar los proveedores y DbProviderFactories en app.config o web.config, es codificar sus ProviderFactories y usarlas en su implementación de DbContext.
Usos:
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;
Clase de configuración:
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)));
}
}
Coloca esto en tu constructor:
public PythonContext() : base($"name=pythonSource")
{
DbConfiguration.SetConfiguration(new SQLiteConfiguration());
}
He ejecutado pruebas de unidad contra ambos métodos (este y la respuesta de zhnglicho) y no he encontrado ninguna diferencia de velocidad.
Salida de depuración (obtener un recuento de registros y una cita aleatoria de 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"...
He votado a favor la respuesta anterior, ya que funcionó para mí, pero esto es solo una sugerencia si no quieres joder con tus configuraciones. ~ ¡PAZ!
entityframework sqlite
Obtuve la respuesta por mi cuenta, pero aún no conozco la causa raíz, ahora funciona. Cambié webconfig, aquí está el webconfig que hace que mi proyecto funcione.
Agregué un proveedor que es "System.Data.Sqlite", tenga en cuenta que su tipo es el mismo que con 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" />
Aquí está todo configurado.
<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>