c# - setup - sqlite visual studio 2008
Ejemplo simple utilizando System.Data.SQLite con Entity Framework 6 (2)
Estoy tratando de obtener un primer ejemplo de código simple para trabajar en una aplicación de consola que use SQLite y EF6, sin embargo, me encuentro con varios errores: creé un nuevo proyecto de consola en VS 2015. Luego instale EF (6.1.3) y Sistema. Data.SQLite (1.0.102) a través de NuGet.
Intenta ejecutar un programa simple:
namespace SQLiteConsole1
{
class Person
{
public int Id { get; set; }
public string Name { get; set; }
}
class MyContext : DbContext
{
public DbSet<Person> Persons { get; set; }
}
class Program
{
static void Main(string[] args)
{
using (var db = new MyContext())
{
var person = new Person() { Name = "John" };
db.Persons.Add(person);
db.SaveChanges();
}
}
}
}
Esto es lo que mi App.Config se ve así:
<connectionStrings>
<add name="MyContext" connectionString="Data Source=C:/Temp/Test.sqlite" providerName="System.Data.SQLite" />
</connectionStrings>
<entityFramework>
<defaultConnectionFactory type="System.Data.Entity.Infrastructure.SqlConnectionFactory, 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" />
</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" />
<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>
Cuando ejecuto este programa por primera vez, obtengo el siguiente error:
"Excepción no controlada: System.InvalidOperationException: No se encontró un proveedor de Entity Framework para el proveedor ADO.NET con el nombre invariable ''System.Data.SQLite''. Asegúrese de que el proveedor esté registrado en la sección ''entityFramework'' del archivo de configuración de la aplicación".
Así que cambio <provider invariantName="System.Data.SQLite.EF6"
por <provider invariantName="System.Data.SQLite"
, luego aparece este error:
Excepción no controlada: System.Data.Entity.Infrastructure.DbUpdateException: Se produjo un error al actualizar las entradas. Vea la excepción interna para más detalles. System.Data.Entity.Core.UpdateException: Se produjo un error al actualizar las entradas. Vea la excepción interna para más detalles. System.Data.SQLite.SQLiteException: error de lógica SQL o falta de la base de datos en dicha tabla: People
¿Qué se necesita cambiar para que este ejemplo simple funcione?
Necesita inicializar su base de datos con las tablas para sus modelos. Observe el error "Error de lógica SQL o falta en la base de datos de dicha tabla: Personas".
Eso significa que necesita ejecutar SQL para crear las tablas correspondientes en la base de datos; afortunadamente, si usa VS, en el menú contextual mientras está en el editor de modelos (archivos * .edmx), existe la opción de que genere automáticamente el SQL y ejecútelo para crear las entradas de la tabla en la base de datos para usted según el modelo. Nota: a veces, la generación automática para no MS-SQL puede tener problemas que deben solucionarse manualmente antes de compilarse / ejecutarse.
Una pregunta similar se hace aquí: Entity Framework 6 con código SQLite 3 primero: no creará tablas
kjbartel proporciona una explicación muy útil de que la creación de tablas no es compatible con el controlador EF SQLite.
También vea https://github.com/msallin/SQLiteCodeFirst , que proporciona una excelente solución. Instalé el paquete SQLite.CodeFirst NuGet y agregué el siguiente código, luego la aplicación funciona bien:
class MyContext : DbContext
{
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
var sqliteConnectionInitializer = new SqliteCreateDatabaseIfNotExists<MyContext>(modelBuilder);
Database.SetInitializer(sqliteConnectionInitializer);
}
public DbSet<Person> Persons { get; set; }
}