如何在没有任何硬编码的连接字符串的情况下在DbContext中设置OnConfiguring方法?

时间:2019-12-30 18:44:15

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

我正在使用多个示例来说明如何设置MySql服务,但是几乎每个示例(包括Microsoft)都使用了硬编码的连接字符串。

这是我的创业公司

    services.AddDbContext<DbContext>(options =>
    {
        options.UseMySql(configuration.GetConnectionString("DefaultConnection"),
        mysqlOptions =>
        {
            mysqlOptions.ServerVersion(new ServerVersion(new Version(8, 0, 18)));
        });
    });

每当我尝试Update-Database时,我都会看到一条错误消息,告诉我未设置密码

  

MySql.Data.MySqlClient.MySqlException(0x80004005):用户'root'@'localhost'的访问被拒绝(使用密码:是)。

环顾四周后,我发现了一个名为OnConfiguring的可重写方法,但是我想以动态方式设置连接字符串,因为如果更改环境,我也希望该字符串也更改。

在这里,我发现几乎每个带有硬编码字符串(例如https://dev.mysql.com/doc/connector-net/en/connector-net-entityframework-core.html)的示例

4 个答案:

答案 0 :(得分:0)

在配置文件中,您应该具有一个ConnectionStrings,它带有其他选项指向您的数据库。

"ConnectionStrings": {
   "DefaultConnection": "server=127.0.0.1;uid=root;pwd=12345;database=test"
},

使用configuration.GetConnectionString时,您正在配置部分中查找值。

答案 1 :(得分:0)

如果未配置,则需要初始化配置。

这可以通过覆盖OnConfiguring中的DbContext方法来实现。

这样,您可以具有全局应用程序配置,该配置将在运行应用程序时被拉出。并在进行Db迁移时使用本地配置。

尝试

public class YourContext: DbContext
{

    protected override void OnConfiguring(DbContextOptionsBuilder options)
    {
        if (options.IsConfigured == false)
            options.UseMysql({YOUR_CONNECTION_STRING});
    }
}

答案 2 :(得分:0)

在startup.cs上尝试

public class Startup
{
    private readonly IConfiguration _config;

    public Startup(IConfiguration config) 
    {
        _config = config;
    }

    // This method gets called by the runtime. Use this method to add services to the 
    container.
    public void ConfigureServices(IServiceCollection services)
    {
        services.AddDbContext<MainContext>(options => 
           options.UseOracle(_config["CONNECTION_STRING"]));
    }
 }

然后在您的上下文控制器上完成

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

答案 3 :(得分:0)

基于comment,我认为您想将EF Core相关类分离到另一个程序集中。

UseMySql中,有一个配置MigrationsAssembly的选项。您可以获取更多详细信息here

这是SQL Server的伪代码。

services.AddDbContext<EFCoreDemoContext>(options =>
{
    options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection"),
            assembly => assembly.MigrationsAssembly(typeof(EFCoreDemoContext).Assembly.FullName));
});