私の問題は、以下のコードが起動時にデータストアを登録しないことです。これは、アプリケーションからの応答で受け取る特定の「エラー」ステートメントです。
An unhandled exception occurred while processing the request.
InvalidOperationException: No data stores are configured. Configure a data store by overriding OnConfiguring in your DbContext class or in the AddDbContext method when setting up services.
Microsoft.Data.Entity.Storage.DataStoreSelector.SelectDataStore(ServiceProviderSource providerSource)
ConfigureServices(IServiceCollection services)で、ラムダのDbContextにDbContextOptionsを指定しようとしています。コード:
services.AddEntityFramework(Configuration)
.AddSqlServer()
.AddDbContext<MyDbContext>(
options =>
options.UseSqlServer(Configuration.Get("Data:DefaultConnection:ConnectionString"))
);
私のDbContextには、オプションをベースのコードに送信するコンストラクターがあります。
public MyContext(DbContextOptions options) : base(options) { }
起動時に読み取られる構成ファイルconfig.jsonには、次の接続文字列が含まれています。
"Data": {
"DefaultConnection": {
"ConnectionString": "Server=(localdb)\\MSSQLLocalDB;Database=MyDbName;Trusted_Connection=True;MultipleActiveResultSets=True;"
}
}
私は以前に使用しました
protected override void OnConfiguring(DbContextOptions options)
{
options.UseSqlServer(Startup.Configuration.Get("Data:DefaultConnection:ConnectionString"));
}
私のDbContextで正常に。データストアを登録し、正しく機能しますが、ラムダ方式を使用したいと思います。
さらに必要な情報があれば、私が提供します。
コンテキストをコントローラーに注入していますか、それとも使用している場所に注入していますか?コンテキストを挿入する代わりに新しいものにしようとすると、Startup.csで指定された構成が使用されないことがわかりました。
public class MyContext : DbContext
{
private string _connectionString { get; set; }
public MyContext(string connectionString) //Inject external connectionstring.
{
_connectionString = connectionString;
}
public MyContext(DbContextOptionsBuilder options) : base(options.Options) //Default binding from web.config.
{
}
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
if (!optionsBuilder.IsConfigured && false == string.IsNullOrEmpty(_connectionString)) // if no default binding
{
optionsBuilder.UseSqlServer(_connectionString); //Use provider as SQL server and make connection through connection string.
optionsBuilder.UseLoggerFactory(_factory);//optional, Use Logger factory
}
base.OnConfiguring(optionsBuilder); //configure connection
}
}
私は(まだ)EF7とベータ4で同じ問題を抱えています。これは私のデータコンテキストでの回避策です。
public class AspNetDataContext : IdentityDbContext, IDataContext
{
private readonly string _connectionString;
public DbSet<Player> Players { get; set; }
public AspNetDataContext(DbContextOptions options)
{
_connectionString = ((SqlServerOptionsExtension)options.Extensions.First()).ConnectionString;
}
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
optionsBuilder.UseSqlServer(_connectionString);
}
}
オプションから接続文字列を抽出し、これをOnConfigureメソッドで使用します。これはまだ私たちが望んでいる解決策ではありませんが、Startup.csで何かを変更する必要はありません(あなたが説明したようなものはすべてあります)。そして、これが修正されるとすぐに、データコンテキストクラスからものを削除する必要があります。そして多分誰かがこの問題に対する別の(そしてさらに良い)解決策を持っています。