Ответ 1
Вот подход, который может сработать для вас.
Если я запустил его в папке совместно используемого проекта, он не имеет доступа к строке подключения, указанной в 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"
}
}
Если вы этого не сделаете, возможно, стоит попробовать.
Я почерпнул из таких вопросов, что он работает из общего проекта, если вы указали строку соединения в методе OnConfiguring для DbContext, но я действительно хотел бы оставить этот код отдельно от конфигурации.
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, вместо этого вы можете использовать переменные среды или секреты пользователя.