ここにあなたのために働くかもしれないアプローチがあります。
共有プロジェクトのフォルダーで実行すると、startup.cs で指定された接続文字列にアクセスできません。
Startup.cs
Startup.cs では、接続文字列をConfiguration
ハードコーディングするのではなく、アクセスして指定していると想定しています。さらに、Startup.cs ファイルのコンストラクターで、いくつかのソースから構成をセットアップしていると想定しています。つまり、Startup.cs は次のようになります。
public class Startup
{
public IConfiguration Config { get; set; }
public Startup(IHostingEnvironment env)
{
var config = new Configuration()
.AddJsonFile("config.json")
.AddUserSecrets()
.AddEnvironmentVariables();
Config = config;
}
public void ConfigureServices(IServiceCollection services)
{
services.AddEntityFramework()
.AddSqlServer()
.AddDbContext<MyDbContext>(options =>
{
options.UseSqlServer(Config["ConnectionStrings:MyDbContext"]);
});
}
public void Configure(IApplicationBuilder app, IServiceProvider serviceProvider)
{
var db = serviceProvider.GetRequiredService<MyDbContext>();
db.Database.AsSqlServer().EnsureCreated();
app.Run(async (context) =>
{
await context.Response.WriteAsync("Hello World!");
});
}
}
config.json
さらに、プロジェクトのルートにある config.json に接続文字列を追加していると仮定しています (または、ユーザー シークレットまたは環境変数を介して接続文字列を追加していると想定しています)。config.json は次のようになります。
{
"ConnectionStrings": {
"MyDbContext": "Some-Connection-String"
}
}
もしそうでないなら、試してみる価値があるかもしれません。
このような質問から、DbContext の OnConfiguring メソッドで接続文字列を指定すると共有プロジェクトから機能することがわかりましたが、このコードを構成とは別にしたいと思います。
DbContext
上記の仮定が正しければDbContext
、クラスで使用したのと同じパターンを使用して、 の接続文字列にアクセスできますStartup
。つまり、DbContext
コンストラクターで、IConfiguration
. 次に、 でOnConfiguring
接続文字列にアクセスします。次のようになります。
public class MyDbContext : DbContext
{
protected override void OnModelCreating(ModelBuilder builder)
{
builder.Entity<SomeModel>().Key(e => e.Id);
base.OnModelCreating(builder);
}
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
var connString = Config["ConnectionStrings:MyDbContext"];
optionsBuilder.UseSqlServer(connString);
}
public IConfiguration Config { get; set; }
public MyDbContext()
{
var config = new Configuration()
.AddJsonFile("config.json")
.AddEnvironmentVariables();
Config = config;
}
}
プロジェクトの構造
もちろん、共有プロジェクト フォルダーのルートにも config.json ファイルが必要です。したがって、プロジェクトの構造は次のようになります。
SharedDataContext
Migrations
config.json
project.json
WebApp
config.json
project.json
Startup.cs
上記の両方の config.json ファイルには、DbContext
.
いくつかの考え
config.json 接続文字列を複製したくない場合は、代わりに環境変数またはユーザー シークレットを使用できます。