web-dev-qa-db-ja.com

データストアを登録しないStartup.csにDbContextOptionsを追加する

私の問題は、以下のコードが起動時にデータストアを登録しないことです。これは、アプリケーションからの応答で受け取る特定の「エラー」ステートメントです。

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で正常に。データストアを登録し、正しく機能しますが、ラムダ方式を使用したいと思います。

さらに必要な情報があれば、私が提供します。

10
DanielRJ

コンテキストをコントローラーに注入していますか、それとも使用している場所に注入していますか?コンテキストを挿入する代わりに新しいものにしようとすると、Startup.csで指定された構成が使用されないことがわかりました。

5
Slick86
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で何かを変更する必要はありません(あなたが説明したようなものはすべてあります)。そして、これが修正されるとすぐに、データコンテキストクラスからものを削除する必要があります。そして多分誰かがこの問題に対する別の(そしてさらに良い)解決策を持っています。

1