web-dev-qa-db-ja.com

ASP.NET 5、EF 7、SQLite-SQLiteエラー1:「そのようなテーブルはありません:ブログ」

Entity Framework 7について Getting Started on ASP.NET 5 ガイドに従い、MicrosoftSqlServerをSqliteに置き換えました。コードの唯一の違いはStartup.csです。

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

Webサイトを実行して/ Blogsに移動すると、エラーが発生します。

Microsoft.Data.Sqlite.SqliteExceptionがユーザーコードによって処理されなかった
ErrorCode = -2147467259 HResult = -2147467259 Message = SQLiteエラー1: 'そのようなテーブルはありません:ブログ' Source = Microsoft.Data.Sqlite
SqliteErrorCode = 1 StackTrace:Microsoft.Data.Sqlite.Sqlite.SqliteCommand.ExecuteReader(CommandBehavior Behavior)at Microsoft.Data.Sqlite。at Microsoft.Data.Sqlite.Interop.MarshalEx.ThrowExceptionForRC(Int32 rc、Sqlite3Handle db)。 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( )System.Linq.Enumerable.d__1`2.MoveNext()at System.Linq.Enumerable.WhereSelectEnumerableIterator`2.MoveNext()at Microsoft.Data.Entity.Query.LinqOperatorProvider.ExceptionInterceptor`1.EnumeratorExceptionInterceptor.MoveNext()で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\EFGetStart ed.AspNet5\Controllers\BlogsController.cs:regel 18 InnerException:

「Blog」というテーブルがないかのようにこれを理解していますが、DBite Browser for SQLiteで.dbファイルを開くと、「Blog」というテーブルがあります。

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

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

16
Arthur Rump

EFによって実際に開かれているデータベースが、DBブラウザーで開いているファイルではない可能性があります。 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"); });
    }
}
15
natemcmaster

EF Coreドキュメントから取得...

Visual Studioから実行

このサンプルをVisual Studioから実行するには、作業ディレクトリを手動でプロジェクトのルートに設定する必要があります。作業ディレクトリを設定しない場合、次のMicrosoft.Data.Sqlite.SqliteExceptionがスローされます。SQLiteエラー1:「そのようなテーブルはありません:ブログ」。

作業ディレクトリを設定するには:

  • ソリューションエクスプローラーでプロジェクトを右クリックし、プロパティを選択します。
  • 左ペインでDebugタブを選択します。
  • Working directoryをプロジェクトディレクトリに設定します。
  • 変更を保存します。
8
jjoselon

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

私はこの問題をnetcoreapp2.0。関連する issue がありますが、それは問題がある可能性がありますが、私はナイトリービルドに行って解決したくありませんでした。

私にとっての解決策は、ビルダー文字列を使用する代わりにSqliteConnectionを作成して渡すことでした。

したがって、このセットアップでは:

string id = string.Format("{0}.db", Guid.NewGuid().ToString());

var builder = new SqliteConnectionStringBuilder()
{
    DataSource = id,
    Mode = SqliteOpenMode.Memory,
    Cache = SqliteCacheMode.Shared
};

次のようにDIを作成します。

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();

このアプローチを使用すると、DIでインスタンス化されたSomeDbContextのすべてのコピーがすべて有効なSQLiteデータベースを指し、そのデータベースには、エンティティごとにスキーマが自動作成されます。

3
user326608

私はこれを行いましたが、それでもデータベースのロードに問題がありました。データベースコンテキストのコンストラクターに次のコードを追加しました:Database.EnsureCreated();


これで、私のコンテキストファイルは次のようになります。 BoardGameDBContextFile

新しいAzureホスティングサイトに新しいデータベースを作成したため、移行する既存のデータが大量にある場合、これは機能しません。それは私のために働いたので、共有したいと思った。

2
Michael