9

Getting Started on ASP.NET 5のEntity Framework 7に関するガイドと、Microsoft SQL ServerをSqliteに置き換えました。 CS:私はウェブサイトを実行し、/のブログに移動するとASP.NET 5、EF 7およびSQLite - SQLiteエラー1: 'そのようなテーブルはありません:Blog'

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

、私はエラーを取得する:

Microsoft.Data.Sqlite.SqliteException was unhandled by user code
ErrorCode=-2147467259 HResult=-2147467259 Message=SQLite Error 1: 'no such table: Blog' Source=Microsoft.Data.Sqlite
SqliteErrorCode=1 StackTrace: at Microsoft.Data.Sqlite.Interop.MarshalEx.ThrowExceptionForRC(Int32 rc, Sqlite3Handle db) at Microsoft.Data.Sqlite.SqliteCommand.ExecuteReader(CommandBehavior behavior) at Microsoft.Data.Sqlite.SqliteCommand.ExecuteDbDataReader(CommandBehavior behavior) at System.Data.Common.DbCommand.ExecuteReader() at Microsoft.Data.Entity.Query.Internal.QueryingEnumerable.Enumerator.MoveNext() at System.Linq.Enumerable.WhereSelectEnumerableIterator`2.MoveNext() at System.Linq.Enumerable.d__1`2.MoveNext() at System.Linq.Enumerable.WhereSelectEnumerableIterator`2.MoveNext() at Microsoft.Data.Entity.Query.LinqOperatorProvider.ExceptionInterceptor`1.EnumeratorExceptionInterceptor.MoveNext() at System.Collections.Generic.List`1..ctor(IEnumerable`1 collection) at System.Linq.Enumerable.ToList[TSource](IEnumerable`1 source) at EFGetStarted.AspNet5.Controllers.BlogsController.Index() in d:\arthur\documents\visual studio 2015\Projects\EFGetStarted.AspNet5\src\EFGetStarted.AspNet5\Controllers\BlogsController.cs:regel 18 InnerException:

「ブログ」と呼ばれた表がない場合、私はこれを理解し、私が開いたときSQLiteのDB Browserの.dbファイルには、実際には「Blog」というテーブルがあります。

Screenshot from DB Browser for SQLite showing a table called 'Blog'

んSQLiteはコード内の他の変更を必要とし、またはこれは、Entity FrameworkのSQLiteのコネクタにエラーですか?

+0

あなた 'BlogsController.Index'方法はどのようなものが見えますか? – DavidG

+0

あなたは正しいデータベースに接続していますか? – DevilSuichiro

+0

@DavidG public IActionResult Index(){戻り値View(_context.Blogs.ToList()); } ' –

答えて

3

実際にEFで開いているデータベースは、DBブラウザで開いているファイルではありません。 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"); }); 
    } 
} 
+0

この回答をお寄せいただきありがとうございます。私はASP.NET Core 1.0を使ってこの問題に遭遇しました。私はappsettings.jsonで指定したデータソースを持っていましたが、変数が気に入らないようでしたので、 "ConnectionStrings":{ "DefaultConnection": "データソース= C:\\ aspnetcoresqllitedbs \\ data \\ WebApplication.db " } –

0

この問題はnetcoreapp2.0にありました。関連しているのはissueであるかもしれませんが、私は夜間のビルドに行くことでそれを解決したくありませんでした。

解決策は、ビルダ文字列を使用する代わりにSqliteConnectionを作成して渡すことでした。このセットアップのためにそう

:そうのようなDI用

 string id = string.Format("{0}.db", Guid.NewGuid().ToString()); 
     var builder = new SqliteConnectionStringBuilder() 
     { 
      DataSource = id, 
      Mode = SqliteOpenMode.Memory, 
      Cache = SqliteCacheMode.Shared 
     }; 

作曲:

 var connection = new SqliteConnection(builder.ConnectionString); 
     connection.Open(); 
     connection.EnableExtensions(true); 
     services.AddDbContext<SomeDbContext>(options => options.UseSqlite(connection)); 

私はINITのこのスタイルを使用していたていたエラー:

 services.AddDbContext<SomeDbContext>(options => options.UseSqlite(builder.ConnectionString)); 

マイ足場また、次の連絡先への一度の電話があります。

  var dbContext = serviceScope.ServiceProvider.GetService<SomeDbContext>(); 
      dbContext.Database.OpenConnection(); 
      dbContext.Database.EnsureCreated(); 

SomeDbContextのすべてのDIインスタンス化されたコピーは、有効なSQLite dbを指し、dbは自分のエンティティごとに自動作成されたスキーマを持ちます。

0

IApplicationEnvironmentがIHostingEnvironmentに置き換えられたため、変更されたように見えます。

Removing 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"); }); 
    } 
} 
関連する問題