Exemplo simples usando o sistema.Dado.SQLite com o Entity Framework 6
estou a tentar obter um primeiro exemplo de código simples para funcionar num aplicativo de consola usando SQLite e EF6, no entanto estou a correr em vários erros: Criei um novo projecto de consola em VS 2015. Em seguida, instalar EF (6.1.3) e sistema.Dado.SQLite (1.0.102) via NuGet.
tente executar um programa simples:
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();
}
}
}
}
Isto é o meu aplicativo.A configuração parece-se com isto:
<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>
Quando eu executar este programa pela primeira vez eu recebo o seguinte erro:
Excepção Não Tratada: Sistema.InvalidOperationException: No Entity Framework provedor encontrado para a ADO.NET fornecedor com nome invariante Sistema.Dado.SQLite". Certifique - se de que o provedor está registrado no secção "quadro de direitos" do ficheiro de configuração da aplicação."
então eu mudo <provider invariantName="System.Data.SQLite.EF6"
para <provider invariantName="System.Data.SQLite"
, Então eu recebo este erro:
O que é preciso mudar para que este exemplo simples funcione?Excepção Não Tratada: Sistema.Dado.Entidade.Infraestrutura.DbUpdateException: ocorreu um erro enquanto actualiza as entradas. Veja a exceção interior para mais detalhes. Sistema.Dado.Entidade.Nucleo.UpdateException: ocorreu um erro enquanto a actualizar as entradas. Veja a exceção interior para mais detalhes. Sistema.Dado.SQLite.SQLiteException: erro lógico SQL ou em falta base de dados não existe tal tabela: Pessoas
2 answers
O Kjbartel dá uma explicação muito útil de que a criação da tabela não é suportada pelo controlador EF SQLite.
Ver também https://github.com/msallin/SQLiteCodeFirst , que fornece uma excelente solução. Instalei o SQLite.Pacote CodeFirst NuGet, e adicionou o código abaixo, em seguida, o aplicativo funciona bem:
class MyContext : DbContext
{
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
var sqliteConnectionInitializer = new SqliteCreateDatabaseIfNotExists<MyContext>(modelBuilder);
Database.SetInitializer(sqliteConnectionInitializer);
}
public DbSet<Person> Persons { get; set; }
}
Você precisa inicializar a sua base de dados com as tabelas para os seus modelos. Note o erro "SQL logic error or missing database no such table: People".
Isso significa que você precisa executar SQL para criar as tabelas correspondentes na base de dados, Felizmente, se usar VS, no menu de contexto, enquanto no editor de modelos (*.arquivos edmx), existe uma opção para que ele auto-gerar o SQL e executá-lo para criar as entradas de tabela no banco de dados para você com base no modelo. Nota: às vezes o auto-gerado para não MS-SQL pode ter problemas que precisam ser corrigidos manualmente antes que ele irá compilar/executar.