如何将连接字符串从appsettings.[name].json传递到.NET Core中的DbContext?

如何将连接字符串从appsettings.[name].json传递到.NET Core中的DbContext?,.net,.net-core,connection-string,dbcontext,.net,.net Core,Connection String,Dbcontext,我有一个.net核心应用程序。我在appsettings.json文件中写入连接字符串。 但是,现在,我想为我的上下文获取连接字符串。怎么做 在.net framework 4.6中,我使用了以下内容: ConfigurationManager.ConnectionStrings["ConnStrName"].ConnectionString; 我有这样的appsettings.Development.json(***可以是任何名称): 我增加了服务: services.AddTransien

我有一个.net核心应用程序。我在appsettings.json文件中写入连接字符串。 但是,现在,我想为我的上下文获取连接字符串。怎么做

在.net framework 4.6中,我使用了以下内容:

ConfigurationManager.ConnectionStrings["ConnStrName"].ConnectionString;
我有这样的appsettings.Development.json(***可以是任何名称):

我增加了服务:

services.AddTransient<MyContext>(provider =>
            {
                return new MyContext(configuration["ConnectionStrings:***"]);
            });
之后,我在运行enablemigation命令后出现了这个错误

目标上下文“MyContext”不可构造。添加默认构造函数或提供IDbContextFactory的实现

如果我可以在这里从json获取连接字符串:

一切都会好的。但如果可能的话,我想在.NET CORE中用一行代码来实现这一点,就像在.NET framework中一样:

ConfigurationManager.ConnectionStrings["ConnStrName"].ConnectionString;
.net framework 4.6


NET Core中的所有内容都是围绕依赖项注入构建的,而不是使用ConfigurationManager之类的静态实例

你可以用几种不同的方法来做

第一种方法是在Startup.cs ConfigureServices中注册您的DbContext,方法如下:

services.AddDbContext<MyContext>(context => context.UseSqlServer(Configuration.GetConnectionString("name")));
或者,如果不想这样做,也可以将“IConfiguration”注入DbContext的构造函数中,然后使用IConfiguration获取连接字符串:

public class SomeClass(IConfiguration config)
{
    config.GetConnectionString("name")
}

我最初的回答不适合您的情况,因为我假设您正在移植到.NETCore,而不是维护完整的.NETFramework项目和新的.NETCore项目之间的兼容性

我对遗留项目做了类似的事情,最终创建了一个类,作为连接字符串的存储,然后根据使用它的项目是.NET Core还是完整的.NET Framework,它的填充方式会有所不同

对于完整的.NET Framework项目,它将从ConfigurationManager填充连接字符串

对于.NET核心项目,您需要从appsettings.json读取连接字符串,然后在启动时将连接字符串传递给该类

然后,您必须将DbContext中对ConfigurationManager的引用更改为您为检索连接字符串而创建的新类

public class DatabaseConfiguration
{
    /// <summary>
    /// Database Connection Strings
    /// </summary>
    private static List<ConnectionStringSettings> _conStrings;
    public static List<ConnectionStringSettings> ConnectionStrings
    {
        get
        {
            //If it wasn't initialized manually, Initialize using the Configuration Manager. 
            if (_conStrings == null || !_conStrings.Any())
            {
                Initialize();
            }

            return _conStrings;
        }
    }

    /// <summary>
    /// Sets the connection strings from the Configuration Manager.
    /// </summary>
    public static void Initialize()
    {
        _conStrings = new List<ConnectionStringSettings>();
            foreach (ConnectionStringSettings connection in ConfigurationManager.ConnectionStrings)
            {
                _conStrings.Add(connection);
            }
    }

    /// <summary>
    /// Sets the connection strings manually. This is used when the project is a .NET Core app because it doesn't use the Configuration Manager, app.config, or web.config.
    /// </summary>
    public static void Initialize(List<ConnectionStringSettings>connectionStrings)
    {                
        _conStrings = connectionSttrings;
    }

/// <summary>
/// Gets the connection string for a database with the given name.
/// </summary>
/// <param name="name">DB Name</param>
/// <returns>Connection String</returns>
public static string GetConnectionString(string name)
{
    var matchingConnection = ConnectionStrings.Find(c => c.Name == name);
    return matchingConnection?.ConnectionString;
}

}
公共类数据库配置
{
/// 
///数据库连接字符串
/// 
私有静态列表_解释;
公共静态列表连接字符串
{
得到
{
//如果未手动初始化,请使用Configuration Manager进行初始化。
如果(_conStrings==null | |!_conStrings.Any())
{
初始化();
}
退货(解释);;
}
}
/// 
///从Configuration Manager设置连接字符串。
/// 
公共静态void Initialize()
{
_解释=新列表();
foreach(ConfigurationManager.ConnectionString中的ConnectionString设置连接)
{
_施工。增加(连接);
}
}
/// 
///手动设置连接字符串。当项目是.NET Core应用程序时使用此选项,因为它不使用Configuration Manager、app.config或web.config。
/// 
公共静态无效初始化(ListConnectionString)
{                
_构造=连接构造;
}
/// 
///获取具有给定名称的数据库的连接字符串。
/// 
///数据库名
///连接字符串
公共静态字符串GetConnectionString(字符串名称)
{
var matchingConnection=ConnectionStrings.Find(c=>c.Name==Name);
返回匹配连接?.ConnectionString;
}
}
public class SomeClass(MyContext context)
{

}
public class SomeClass(IConfiguration config)
{
    config.GetConnectionString("name")
}
public class DatabaseConfiguration
{
    /// <summary>
    /// Database Connection Strings
    /// </summary>
    private static List<ConnectionStringSettings> _conStrings;
    public static List<ConnectionStringSettings> ConnectionStrings
    {
        get
        {
            //If it wasn't initialized manually, Initialize using the Configuration Manager. 
            if (_conStrings == null || !_conStrings.Any())
            {
                Initialize();
            }

            return _conStrings;
        }
    }

    /// <summary>
    /// Sets the connection strings from the Configuration Manager.
    /// </summary>
    public static void Initialize()
    {
        _conStrings = new List<ConnectionStringSettings>();
            foreach (ConnectionStringSettings connection in ConfigurationManager.ConnectionStrings)
            {
                _conStrings.Add(connection);
            }
    }

    /// <summary>
    /// Sets the connection strings manually. This is used when the project is a .NET Core app because it doesn't use the Configuration Manager, app.config, or web.config.
    /// </summary>
    public static void Initialize(List<ConnectionStringSettings>connectionStrings)
    {                
        _conStrings = connectionSttrings;
    }

/// <summary>
/// Gets the connection string for a database with the given name.
/// </summary>
/// <param name="name">DB Name</param>
/// <returns>Connection String</returns>
public static string GetConnectionString(string name)
{
    var matchingConnection = ConnectionStrings.Find(c => c.Name == name);
    return matchingConnection?.ConnectionString;
}

}