EF Core - Строка подключения не может быть нулевой - PullRequest
0 голосов
/ 12 декабря 2018

Я использую ASP.Net Core 2.1 с EF Core 2.1

При выполнении любой миграции из PMC я получаю сообщение об ошибке ниже

Значение не может быть нулевым.Имя параметра: connectionString

Вот так выглядит мой класс Context *

public class MyAppContextFactory : IDesignTimeDbContextFactory<MyAppContext>
{
    private readonly string _dbConnection;

    public MyAppContextFactory()
    {

    }
    public MyAppContextFactory(string dbConnection)
        : this()
    {
        _dbConnection = dbConnection;

    }

    public MyAppContext CreateDbContext(string[] args)
    {
        var optionsBuilder = new DbContextOptionsBuilder<MyAppContext>();
        optionsBuilder.UseSqlServer(_dbConnection, opts => opts.CommandTimeout((int)TimeSpan.FromMinutes(15).TotalSeconds));
        return new MyAppContext(optionsBuilder.Options);
    }


}

Моя строка подключения присутствует на уровне API в appsettings.json и не рекомендуется добавлятьлюбая ссылка на EF на уровне API / UI.

Как настроить строку подключения в соответствии со средой в такой многоуровневой архитектуре?

Спасибо.

1 Ответ

0 голосов
/ 12 декабря 2018

EF фактически запускает ваше приложение для генерации миграции с 2.0, я думаю.Вам нужно добавить DesignTimeDbContextFactory в ваш проект, который будет запрашивать строку подключения для этого варианта использования, например, так:

public class DesignTimeDbContextFactory : IDesignTimeDbContextFactory<StorageContext>
    {
        public StorageContext CreateDbContext(string[] args)
        {
            IConfigurationRoot configuration = new ConfigurationBuilder()
                .SetBasePath(Directory.GetCurrentDirectory())
                .AddJsonFile("appsettings.json", optional: false)
                .AddJsonFile("appsettings.Development.json", optional: true)
                .Build();

            var builder = new DbContextOptionsBuilder<StorageContext>();
            var connectionString = configuration.GetConnectionString("DefaultConnection");
            builder.UseSqlServer(connectionString);

            Console.WriteLine($"Running DesignTime DB context. ({connectionString})");

            return new StorageContext(builder.Options);
        }
    }
...