EF Core-连接字符串不能为空

时间:2018-12-12 15:05:01

标签: c# entity-framework-core asp.net-core-2.1 ef-core-2.1

我将ASP.Net Core 2.1EF Core 2.1一起使用

从PMC运行任何迁移时,出现以下错误

  

值不能为null。参数名称: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);
    }


}

我的连接字符串出现在appsettings.json的API层中,按照惯例,我不应该在API / UI层中添加对EF的任何引用。

如何在这种分层体系结构中根据环境设置连接字符串?

谢谢。

1 个答案:

答案 0 :(得分:0)

我认为

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);
        }
    }