2011-11-15 24 views
20

Estoy tratando de crear una base de datos SQLite incorporada sobre la marcha con el EF sin embargo, no puedo hacer que funcione, el archivo de base de datos nunca se está creando.HOWTO: SQLite con EntityFramework y Code-First

tengo EF 4.2 y la versión más reciente de SQLite

Aquí es lo que tengo

app.config

<?xml version="1.0"?> 
<configuration> 
    <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"/> 
    </DbProviderFactories> 
    </system.data> 
    <connectionStrings> 
    <add name="DataContext" 
     connectionString="Data Source=test.db;Version=3;New=True;" 
     providerName="System.Data.SQLite" /> 
    </connectionStrings> 
    <startup> 
    <supportedRuntime version="v4.0" /> 
    </startup> 
</configuration> 

DB inicializador (por decirlo de algún contenido en)

class PageDbInitializer : DropCreateDatabaseAlways<PageDB> 
{ 
    protected override void Seed(PageDB context) 
    { 
     for (int i = 0; i < 10; i++) 
     { 
      WebPage page = new WebPage() { Name = "Page" + (i + 1) }; 
      context.Pages.Add(page); 
     } 
     base.Seed(context); 
    } 
} 

DbContext:

class PageDB : DbContext 
{ 
     public DbSet<WebPage> Pages { get; set; } 
} 

y finalmente en el principal()

Database.SetInitializer(new PageDbInitializer()); 

Creo que tengo algunos pasos que faltan, pero no pueden encontrar a cabo.

+0

Solo por curiosidad, ¿qué terminaste haciendo? usaste el proveedor devart o encontraste otra? –

+0

@StellaMusik Terminé usando SQLExpress por el momento, pero siempre puede usar modelo o base de datos primero con SQLlite –

+0

@PierlucSS enfrentando el mismo problema. No quiero usar Devart, así que aparentemente va a ser modelo primero. –

Respuesta

23

System.Data.SQLite es en la versión actual solo proveedor compatible con EFv1 (1, 2). Significa que no tiene las funciones EFv4 (EFv4.2 es envoltorio alrededor de EFv4), incluida la creación y eliminación de bases de datos (ver DbProviderServices diferencias para .NET 3.5 y .NET 4.0 en MSDN). Por eso, no se puede usar la creación automática de bases de datos con código primero cuando se trabaja con SQLite. Debe crear la base de datos y todas las tablas manualmente.

Como alternativa, puede usar un proveedor diferente para SQLite. Por ejemplo, Devart's SQLite provide r afirma que es compatible con EFv4 y 4.1 y, por lo tanto, crea una base de datos.

+20

. Dado que esta es una publicación anterior, ¿sabes si esta sigue siendo una respuesta válida? Actualmente estoy tratando de encontrar información sobre esto y en mi progreso de investigación, parece que esto sigue siendo cierto (pero no estoy seguro) – Default

+0

Puedo verificar que aún no puedo crear una base de datos con el proveedor actual de sqlite. – user3141326

+0

@ user3141326: ¿Puedes probar EF Core (también conocido como EF 7)? Debería tener compilación en proveedor para SQLite. –

8

mira esto:

https://github.com/msallin/SQLiteCodeFirst

También disponible como NuGet

Se añade algunas Inicializadores DB a su ptoject, como SqliteCreateDatabaseIfNotExists

Aquí está el ejemplo de la página web:

public class MyDbContext : DbContext 
{ 
    public MyDbContext() 
     : base("ConnectionStringName") { } 

    protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 
     var sqliteConnectionInitializer = new SqliteCreateDatabaseIfNotExists<MyDbContext>(
      Database.Connection.ConnectionString, modelBuilder); 
     Database.SetInitializer(sqliteConnectionInitializer); 
    } 
}