ASP.NET 5,EF 7和SQLite - SQLite錯誤1:'沒有這樣的表:博客'

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

我遵循了關於Entity Framework 7的ASP.NET 5入門指南 ,我用Sqlite替換了MicrosoftSqlServer,代碼中唯一的區別在於Startup.cs:

services.AddEntityFramework()
    .AddSqlite()
    .AddDbContext<BloggingContext>(options => options.UseSqlite("Filename=db.db"));

當我運行網站並導航到/ Blogs時,我收到一個錯誤:

用戶代碼未處理Microsoft.Data.Sqlite.SqliteException
ErrorCode = -2147467259 HResult = -2147467259 Message = SQLite Error 1:'no such table:Blog'Inource = Microsoft.Data.Sqlite
SqliteErrorCode = 1 StackTrace:位於Microsoft.Data.Sqlite.SqliteCommand.ExecuteDbDataReader(CommandBehavior)上的Microsoft.Data.Sqlite.SqliteCommand.ExecuteReader(CommandBehavior行為)中的Microsoft.Data.Sqlite.Interop.MarshalEx.ThrowExceptionForRC(Int32 rc,Sqlite3Handle db) System.Data.com上的System.Linq.Enumerable.WhereSelectEnumerableIterator`2.MoveNext()中的System.Data.Common.DbCommand.ExecuteReader()處於System.Data.Entity.Query.Internal.QueryingEnumerable.Enumerator.MoveNext()處於System.Linq .Enumerable.d__1`2.MoveNext()位於System.Collections.Generic的Microsoft.Data.Entity.Query.LinqOperatorProvider.ExceptionInterceptor`1.EnumeratorExceptionInterceptor.MoveNext()的System.Linq.Enumerable.WhereSelectEnumerableIterator`2.MoveNext() System.Linq.Enumerable.ToList [TSource](IEnumerable`1 source)中的.List`1..ctor(IEnumerable`1集合)位於d:\ arthur \ documents \中的EFGetStarted.AspNet5.Controllers.BlogsController.Index() visual studio 2015 \ Projects \ EFGetStarted.AspNet5 \ src \ EFGetStarted.AspNe t5 \ Controllers \ BlogsController.cs:regel 18 InnerException:

我理解這就好像沒有名為'Blog'的表,但是當我在DB Browser for SQLite中打開.db文件時,實際上有一個名為'Blog'的表:

DB Browser for SQLite的屏幕截圖顯示了一個名為'Blog'的表格

SQLite是否需要對代碼進行其他更改,或者這是Entity Framework的SQLite連接器中的錯誤?

一般承認的答案

EF實際上正在打開的數據庫很可能不是您在數據庫瀏覽器中打開的文件。 SQLite使用進程當前工作目錄,如果在IIS或其他服務器中啟動,則可以是與源代碼目錄不同的文件夾。 (參見問題https://github.com/aspnet/Microsoft.Data.Sqlite/issues/132https://github.com/aspnet/Microsoft.Data.Sqlite/issues/55 )。

要確保您的db文件位於正確的位置,請使用絕對路徑。例:

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

熱門答案

事情已經發生變化,因為IApplicationEnvironment已被IHostingEnvironment取代。

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


Related

許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow