web-dev-qa-db-ja.com

.NET CoreでDbContext接続文字列を実装するにはどうすればよいですか?

私の状況はこのリンクに非常に似ているか、少なくとも私のコードは似ており、この同じメソッドを.NET Core構文に適用する方法を見つけようとしています。

接続文字列をコードファーストDbContextに渡す

私の特定のコードは次のとおりです。

_public partial class CompanyFormsContext : DbContext
{
    public CompanyFormsContext()
        : base("name=CompanyFormsContext")
    {
    }

    public CompanyFormsContext(string connName)
        : base("name=" + connName)
    {
    }
    ...
}
_

次のエラーが表示されます:

エラーCS1503引数1: 'string'から 'Microsoft.EntityFrameworkCore.DbContextOptions'に変換できませんCompanyForms..NETCoreApp、Version = v1.0

base("name=CompanyFormsContext")またはbase("name=" = connName)の括弧を越えたとき。

この機能を.NET Coreに実装する正しい方法は何ですか?

編集:

私はappsettings.jsonファイルにデータベース接続に関する次の情報があることを共有したいと考えました:(ただし、startup.csには設定がありません)

_  "Data": {
    "CompanyFormsContext": {
      "ConnectionString": "Server=(localdb)\\projectsv13;Database=companyforms;Trusted_Connection=True;"
    },
    "CompanyFormsContextQA": {
      "ConnectionString": "Server=(localdb)\\projectsv13;Database=companyforms;Trusted_Connection=True;"
    }
  }
_

そして、私は次のリンクを見つけました データストアを登録していないStartup.csにDbContextOptionsを追加 ウェブサイトで、簡単なprotected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)で接続を修正するのに十分かどうか疑問に思います?

リンクから:

_services.AddEntityFramework(Configuration)
    .AddSqlServer()
    .AddDbContext<MyDbContext>(
        options =>
        options.UseSqlServer(Configuration.Get("Data:CompanyFormsContext:ConnectionString"))
    );
_

Startup.csでこの種のサービスが必要ですか?

24

別のオプションは、DbContextOptionsを取る基本コンストラクターを呼び出すことです。

public BooksContext(string connectionString) : base(GetOptions(connectionString))
{
}

private static DbContextOptions GetOptions(string connectionString)
{
    return SqlServerDbContextOptionsExtensions.UseSqlServer(new DbContextOptionsBuilder(), connectionString).Options;
}
30
Ricardo Peres

一般に、起動時にconfigから読み取り、接続文字列を使用して、プロセスのEntity Framework DbContextサービスを構成します。

1)appsettings.jsonに行を追加します。

"DbConnectionString": "Server=s;Database=db;Trusted_Connection=True;",

2)次のように、Startup.csクラスの行を読んで(Startupメソッドが呼び出されてConfigurationを構築した後-通常はConfigureServicesメソッドで):

var connection = Configuration["DbConnectionString"];

3)Entity Frameworkを使用している場合、データベースコンテキストサービスを追加します(MyDbContextはEFによって生成されたコンテキストクラスです)。また、データベースコンテキストをインスタンス化する方法を組み込みの依存関係注入に伝えます。

services.AddDbContext<MyDbContext>(options => options.UseSqlServer(connection));
services.AddScoped<IMyDbContext, MyDbContext>();

IMyDbContextが(シンプルリストで)どこにあるかは、MyDbContextから抽出した単なるインターフェイスです

4)MyDbContextを取得するようにコントローラーを定義できるようになりました。DIは、コントローラーが呼び出されたときに、それを構築し、それを渡します。

public MyController(IMyDbContext context)
{
    _context = context  // store for later use
}
16
Peter

IMOのベストプラクティス:

configuration.jsonに追加します:

     "ConnectionStrings": {
    "BooksContext": "Server=MyServer;Database=MyDb;Trusted_Connection=True;"
  }

およびinitializeセクション:

services.AddDbContext<BooksContext>(options => options.UseSqlServer(configuration.GetConnectionString(nameof(BooksContext))));
6
Timur Lemeshko

静的接続のStartup.cs

services.AddScoped<MyContext>(_ => new MyContext(Configuration.GetConnectionString("myDB")));

動的接続用のTable1Repository.cs

using (var _context = new MyContext(@"server=....){
context.Table1....
}

MyContext.cs

public MyContext(string connectionString) : base(GetOptions(connectionString))
{
}

private static DbContextOptions GetOptions(string connectionString)
{
    return SqlServerDbContextOptionsExtensions.UseSqlServer(new DbContextOptionsBuilder(), connectionString).Options;
}
0
Lakmal