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」というテーブルがあります。
SQLiteはコードの他の変更を必要としますか、それともEntity FrameworkのSQLiteコネクタのエラーですか?
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"); });
}
}
EF Coreドキュメントから取得...
Visual Studioから実行
このサンプルをVisual Studioから実行するには、作業ディレクトリを手動でプロジェクトのルートに設定する必要があります。作業ディレクトリを設定しない場合、次のMicrosoft.Data.Sqlite.SqliteExceptionがスローされます。SQLiteエラー1:「そのようなテーブルはありません:ブログ」。
作業ディレクトリを設定するには:
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"); });
}
}
私はこの問題を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データベースを指し、そのデータベースには、エンティティごとにスキーマが自動作成されます。