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
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.
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
Inoltre, stai usando SQLite o MySQL? Sembra che tu stia facendo riferimento a entrambi in posti diversi. – Steve
sqlite ... Scusa, ho sbagliato a digitare MySQL un paio di volte. Modificato! –