Entity Framework 7 Migration Scaffolding в библиотеке классов с конфигурацией

Попытка добавить миграции в модель EF7, которая находится в библиотеке классов ASP.NET 5. При запуске dnx . ef migration add mymigration выполняется с разными результатами в зависимости от того, какой проект я запускаю.

Если я запустил его в папке основного проекта, он не может найти DbContext, это имеет смысл, потому что DbContext находится в общих проектах и ​​командах ef, которые, вероятно, не заботятся о зависимостях.

Если я запустил его в папке совместно используемого проекта, он не имеет доступа к строке подключения, указанной в startup.cs. Я почерпнул из таких вопросов, как , что он работает из общего проекта, если вы указали строку соединения в методе OnConfiguring для DbContext, но я действительно как оставить этот код отдельно от конфигурации.

Я столкнулся с некоторыми журналами ошибок в репозитории EF7, в которых упоминаются, что они реализовали параметры командной строки для указания проекта и контекста, но есть нет примеров, и я не мог понять, как использовать его, глядя на исходный код в истории фиксации.

Ответ 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, вместо этого вы можете использовать переменные среды или секреты пользователя.