ASP.NET 5、EF 7 和 SQLite - SQLite 錯誤 1:“沒有這樣的表:部落格”
我遵循了關於 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.WhereSelectEnumerableIterator
2.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”的表:
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<MyContext>( options => { options.UseSqlite($"Data Source={_appEnv.ApplicationBasePath}/data.db"); }); } }
