ASP.NET 5, EF 7 e SQLite - SQLite Errore 1: 'nessuna tabella di questo tipo: Blog'

asp.net asp.net-core entity-framework entity-framework-core sqlite

Domanda

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':

Screenshot da DB Browser per SQLite che mostra una tabella chiamata "Blog"

SQLite richiede altre modifiche nel codice o si tratta di un errore nel connettore SQLite per Entity Framework?

Risposta accettata

È 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"); });
    }
}

Risposta popolare

Sembra che le cose siano cambiate perché IApplicationEnvironment è stato sostituito con IHostingEnvironment.

Rimozione di IApplicationEnvironment \ IRuntimeEnvironment

public class Startup
{
    private IHostingEnvironment _appHost;

    public Startup(IHostingEnvironment appHost)
    {
        _appHost = appHost;
    }
    public void ConfigureServices(IServiceCollection services)
    {
        services.AddEntityFrameworkSqlite()
            .AddDbContext<MyContext>(
                options => { options.UseSqlite($"Data Source={_appHost.ContentRootPath}/data.db"); });
    }
}



Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché
Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché