NInject и миграция с использованием EF Core в консольном приложении - PullRequest
0 голосов
/ 23 апреля 2019

Я использую контейнер NInject для Dependency Injection и Entity Framework Core в качестве ORM.Настройка выглядит следующим образом:

Класс контекста БД

    public TarantoContext()
        {

        }
public TarantoContext(DbContextOptions<TarantoContext> options)
        : base(options)
    {
    }

    public virtual DbSet<FileData> FileData { get; set; }
    public virtual DbSet<FileExport> FileExport { get; set; }
    public virtual DbSet<FileStatus> FileStatus { get; set; }
    public virtual DbSet<FileType> FileType { get; set; }
    public static string ConnectionString { get; set; }

    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    {
        if (!optionsBuilder.IsConfigured)
        {
            optionsBuilder.UseSqlServer(ConnectionString);
        }
    }

Program.cs

    TarantoContext.ConnectionString = configurationManager.DatabaseConnection;

Я читаю конфигурацию из json и передаю ее на уровень DataAccess(к контекстному классу).У меня есть несколько таблиц в моей базе данных, и, используя первый подход к базе данных, я создал необходимые модели данных и выполнил код класса dbcontext.Я могу получить данные без проблем.Теперь я хочу добавить миграцию (я могу внести дополнительные изменения в существующие таблицы и создать новые таблицы) и запустить в консоли диспетчера пакетов следующее:

Add-Migration InitialCreate

, что привело к следующей ошибке, так как свойство connectionstringимеет значение null

enter image description here

Я могу исправить это путем жесткого кодирования строки подключения в методе OnConfiguring, который я без проблем пробовал:

protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    {
        if (!optionsBuilder.IsConfigured)
        {
            // The connection string needs to exist in the migration project for the purpose of migrations. Comment it in production.
            optionsBuilder.UseSqlServer(
                "Data Source=temp;Initial Catalog=Demo;Persist Security Info=True;User ID=temp;Password=temp;MultipleActiveResultSets=True;");
            //optionsBuilder.UseSqlServer(ConnectionString);
        }
    }

но я не думаю, что это правильный способ выполнения миграций.Более того, я не уверен, как обрабатывать миграции в продуктах, если я не могу установить строку подключения в Program.cs или вне класса dbcontext.Что меня интересует, так это изучение любого шаблона проектирования, который другие разработчики используют для решения этой ситуации.Любой совет с благодарностью.

1 Ответ

0 голосов
/ 23 апреля 2019

В ASP.NET Core вы можете загрузить строку подключения при настройке служб в методе ConfigureServices. Используйте следующий код:

 services.AddDbContext<ApplicationDatabaseContext>(options =>
     options.UseSqlServer(
         Configuration.GetConnectionString("DefaultConnection"),
         b => b.MigrationsAssembly("....")));

Теперь вызов GetConnectionString извлечет строку подключения из вашего файла конфигурации, т.е. appsettings.json. Чтобы обрабатывать разные строки подключения для разных сред, вы можете переопределить настройки приложения по умолчанию, используя файл appsettings.<Environment>.json, например appsettings.Production.json.

Подробнее об этом здесь: https://docs.microsoft.com/en-us/aspnet/core/fundamentals/environments?view=aspnetcore-2.2

Проверьте соответствующие страницы документации MSDN для этих вещей, поскольку они содержат много информации.

...