2016-02-10 15 views
6

Sto cercando di ottenere System.Data.SQLite per funzionare con Entity Framework 6, utilizzando l'approccio Code First nel progetto WPF C# .NET (4.5.2).Entity Framework 6 non crea tabelle nel database SQLite

Ho controllato e ho cercato di seguire le istruzioni nei seguenti luoghi (tra gli altri), ma sembrano non essere aggiornati, per un diverso dbms, non per Code First, o qualche combinazione di quanto sopra .

https://msdn.microsoft.com/en-us/data/jj592674

https://msdn.microsoft.com/en-us/data/jj592674.aspx

http://nullskull.com/a/10476742/sqlite-in-wpf-with-entity-framework-6.aspx

Entity Framework 6 + SQLite

Penso di aver finalmente ottenuto il mio file app.config impostato correttamente, come segue:

<?xml version="1.0" encoding="utf-8"?> 
<configuration> 
    <configSections> 
    <!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 --> 
    <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" /> 
    </configSections> 
    <startup> 
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5.2" /> 
    </startup> 
    <entityFramework> 
    <!-- from: https://stackoverflow.com/questions/14510096/entity-framework-6-sqlite --> 
    <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> 
    <defaultConnectionFactory type="System.Data.Entity.Infrastructure.LocalDbConnectionFactory, EntityFramework"> 
     <parameters> 
     <parameter value="v11.0" /> 
     </parameters> 
    </defaultConnectionFactory> 
    </entityFramework> 
    <connectionStrings> 
    <add name="MyDatabase" connectionString="Data Source=.\DataFile\myDatabase.sqlite" providerName="System.Data.SQLite" /> 
    </connectionStrings> 
    <system.data> 
    <!-- from: https://stackoverflow.com/questions/14510096/entity-framework-6-sqlite --> 
    <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> 
</configuration> 

La mia definizione DbContext è la seguente:

public class MyDataContext : DbContext 
{ 
    public MyDataContext() : base("name=MyDatabase") 
    { 
    } 
    public DbSet<DataItem> DataItems { get; set; } 
} 

La mia classe DataItem è la seguente:

public class DataItem 
{ 
    [Key] 
    public int MyInt { get; set; } 
    public string MyString { get; set; } 
} 

E sto cercando di chiamare il contesto come questo:

using (var db = new MyDataContext()) 
{ 
    DataItem item = new DataItem { MyInt = 19, MyString = "nineteen" }; 
    db.DataItems.Add(item); 
    try 
    { 
     db.SaveChanges(); 
    } 
    catch (Exception ex) 
    { 
     var x = ex.InnerException; 
     Debug.WriteLine("Inner Exception: {0}", x); 
     throw; 
    } 

} 

Come ho aspettarsi, quando instanziare MyDataContext, il file myDatabase.sqlite viene creato nella mia directory bin\debug\DataFile. Tuttavia, quando provo a chiamare db.SaveChanges(), viene rilevata un'eccezione.

L'InnerException di questa eccezione è System.Data.Entity.Core.UpdateException: An error occurred while updating the entries. See the inner exception for details. ---> System.Data.SQLite.SQLiteException: SQL logic error or missing database no such table: DataItems

Quando guardo nella directory DataFile, il file myDatabase.sqlite è pari a zero byte. Questo mi dice che sebbene DbContext abbia trovato il nome file corretto per il nuovo file di database dal file app.config, non ha fatto il suo codice. Prima creazione di tabelle all'interno del database come previsto.

C'è qualcosa di ovvio che mi manca qui? Tutti gli esempi presuppongono che questo passaggio (estremamente critico) funzioni e che tutto in EF6 segua da un database di lavoro correttamente configurato.

Grazie in anticipo per qualsiasi aiuto potete offrirmi su questo.

+1

Ho eliminato la mia risposta, poiché non era corretta, ma ho trovato questa domanda: http://stackoverflow.com/questions/22174212/entity-framework-6-with-sqlite-3-code-first-wont-create- le tabelle apparentemente EF6 SQLite sono rotte. – Steve

+0

Inoltre, stai usando SQLite o MySQL? Sembra che tu stia facendo riferimento a entrambi in posti diversi. – Steve

+0

sqlite ... Scusa, ho sbagliato a digitare MySQL un paio di volte. Modificato! –

risposta

4

In base a Entity Framework 6 with SQLite 3 Code First - Won't create tables, EF6 non crea tabelle quando utilizzato con SQLite, quindi ho dovuto farlo da solo.

Sono stato in grado di creare un database SQLite utilizzando DB Browser for SQLite e creare personalmente le tabelle. Dovevo fare attenzione per assicurarmi che la struttura delle tabelle che ho creato corrispondesse alle proprietà nelle mie classi Model e usare l'annotazione [Key] sulle classi Model per indicare quale campo è il campo chiave primaria.

Importante: ho dovuto aggiungere elementi esistenti in Visual Studio per prendere quel file e accertarmi che Visual Studio fosse a conoscenza del file.

Inoltre, importante, ho dovuto andare alle Proprietà di quel file e impostare la proprietà 'Copia in Output Directory' su 'Copia se Newer', in modo che il database si diriga verso il bin/debug o bin/rilasciare la directory quando eseguo l'app.Se non l'avessi fatto, il database non esisterebbe in fase di runtime, causando un arresto anomalo del runtime.

+2

era necessario: https://github.com/msallin/SQLiteCodeFirst - era nella domanda collegata: https://stackoverflow.com/a/29460684/492 –

Problemi correlati