Ho seguito la guida introduttiva su ASP.NET 5 su Entity Framework 7 e ho sostituito MicrosoftSqlServer con Sqlite, l'unica differenza nel codice è in Startup.cs:
services.AddEntityFramework()
.AddSqlite()
.AddDbContext<BloggingContext>(options => options.UseSqlite("Filename=db.db"));
Quando eseguo il sito web e navigo in / Blog, viene visualizzato un errore:
Microsoft.Data.Sqlite.SqliteException non è stato gestito dal codice utente
ErrorCode = -2147467259 HResult = -2147467259 Messaggio = SQLite Errore 1: 'nessuna tabella di questo tipo: Blog' Origine = Microsoft.Data.Sqlite
SqliteErrorCode = 1 StackTrace: in Microsoft.Data.Sqlite.Interop.MarshalEx.ThrowExceptionForRC (Int32 rc, Sqlite3Handle db) in Microsoft.Data.Sqlite.SqliteCommand.ExecuteReader (comportamento CommandBehavior) in Microsoft.Data.Sqlite.SqliteCommand.ExecuteDbDataReader (CommandBehavior comportamento) in System.Data.Common.DbCommand.ExecuteReader () in Microsoft.Data.Entity.Query.Internal.QueryingEnumerable.Enumerator.MoveNext () in System.Linq.Enumerable.WhereSelectEnumerableIterator`2.MoveNext () in System.Linq .Enumerable.d__1`2.MoveNext () in System.Linq.Enumerable.WhereSelectEnumerableIterator`2.MoveNext () in Microsoft.Data.Entity.Query.LinqOperatorProvider.ExceptionInterceptor`1.EnumeratorExceptionInterceptor.MoveNext () in System.Collections.Generic .List`1..ctor (raccolta IEnumerable`1) su System.Linq.Enumerable.ToList [TSource] (origine IEnumerable`1) su EFGetStarted.AspNet5.Controllers.BlogsController.Index () in d: \ arthur \ documents \ studio visivo 2015 \ Projects \ EFGetStarted.AspNet5 \ src \ EFGetStarted.AspNe t5 \ Controllers \ BlogsController.cs: regel 18 InnerException:
Capisco questo come se non ci fosse una tabella chiamata 'Blog', ma quando apro il file .db in DB Browser per SQLite, in realtà c'è una tabella chiamata 'Blog':
SQLite richiede altre modifiche nel codice o si tratta di un errore nel connettore SQLite per Entity Framework?
È molto probabile che il database che viene effettivamente aperto da EF non sia il file che si sta aprendo in DB Browser. SQLite utilizza la directory di lavoro corrente del processo, che se lanciata in IIS o in altri server può essere una cartella diversa dalla directory del codice sorgente. (Vedere i problemi https://github.com/aspnet/Microsoft.Data.Sqlite/issues/132 e https://github.com/aspnet/Microsoft.Data.Sqlite/issues/55 ).
Per assicurarti che il tuo file db sia nel posto giusto, usa un percorso assoluto. Esempio:
public class Startup
{
private IApplicationEnvironment _appEnv;
public Startup(IApplicationEnvironment appEnv)
{
_appEnv = appEnv;
}
public void ConfigureServices(IServiceCollection services)
{
services.AddEntityFramework()
.AddSqlite()
.AddDbContext<MyContext>(
options => { options.UseSqlite($"Data Source={_appEnv.ApplicationBasePath}/data.db"); });
}
}
Tratto dalla documentazione EF Core ...
Esegui da Visual Studio
Per eseguire questo esempio da Visual Studio, è necessario impostare manualmente la directory di lavoro in modo che sia la radice del progetto. Se non si imposta la directory di lavoro, viene generata la seguente Microsoft.Data.Sqlite.SqliteException: SQLite Error 1: 'no such table: Blogs'.
Per impostare la directory di lavoro: