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

asp.net-core code-first-migrations dnx entity-framework-core visual-studio-2015

Вопрос

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

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

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

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

Принятый ответ

Вот подход, который может сработать для вас.

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



Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow
Является ли этот КБ законным? Да, узнайте, почему
Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow
Является ли этот КБ законным? Да, узнайте, почему