Asp.net

ASP.NET 5、EF 7 和 SQLite - SQLite 錯誤 1:“沒有這樣的表:部落格”

  • October 31, 2015

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

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

當我執行網站並導航到 /Blogs 時,出現錯誤:

使用者程式碼未處理 Microsoft.Data.Sqlite.SqliteException

ErrorCode=-2147467259 HResult=-2147467259 Message=SQLite 錯誤 1:‘沒有這樣的表:部落格’Source=Microsoft.Data.Sqlite

SqliteErrorCode=1 StackTrace: 在 Microsoft.Data.Sqlite.SqliteCommand.ExecuteReader(CommandBehavior 行為) 在 Microsoft.Data.Sqlite.SqliteCommand.ExecuteDbDataReader(CommandBehavior) 的 Microsoft.Data.Sqlite.Interop.MarshalEx.ThrowExceptionForRC(Int32 rc, Sqlite3Handle db)行為)在 System.Data.Common.DbCommand.ExecuteReader() 在 Microsoft.Data.Entity.Query.Internal.QueryingEnumerable.Enumerator.MoveNext() 在 System.Linq.Enumerable.WhereSelectEnumerableIterator2.MoveNext() 在 System.Linq .Enumerable.d__12.MoveNext() 在 System.Linq.Enumerable.WhereSelectEnumerableIterator2.MoveNext() 在 Microsoft.Data.Entity.Query.LinqOperatorProvider.ExceptionInterceptor1.EnumeratorExceptionInterceptor.MoveNext() 在 System.Collections.Generic .列表1..d:\arthur\documents\visual studio 2015\Projects\ EFGetStarted.AspNet5.Controllers.BlogsController.Index() 中 System.Linq.Enumerable.ToList[TSource](IEnumerable1 源) 的 ctor(IEnumerable`1 集合) EFGetStarted.AspNet5\src\EFGetStarted.AspNet5\Controllers\BlogsController.cs:regel 18 InnerException:

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

DB Browser for SQLite 的螢幕截圖顯示了一個名為“Blog”的表

SQLite 是否需要對程式碼進行其他更改,或者這是實體框架的 SQLite 連接器中的錯誤?

EF 實際打開的數據庫很可能不是您在 DB Browser 中打開的文件。SQLite 使用程序目前工作目錄,如果在 IIS 或其他伺服器中啟動,該目錄可以是與原始碼目錄不同的文件夾。(參見問題<https://github.com/aspnet/Microsoft.Data.Sqlite/issues/132>和<https://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&lt;MyContext&gt;(
               options =&gt; { options.UseSqlite($"Data Source={_appEnv.ApplicationBasePath}/data.db"); });
   }
}

引用自:https://stackoverflow.com/questions/33455041