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:

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

O que é preciso mudar para que este exemplo simples funcione?

Author: squareskittles, 2016-07-24

2 answers

Uma pergunta semelhante é feita aqui.: Entity Framework 6 com o código SQLite 3 Em Primeiro Lugar-não irá criar tabelas

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; }
    }
 35
Author: RaelB, 2017-05-23 11:55:05

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.

 0
Author: Ben Abraham, 2016-07-24 21:53:39