将连接字符串传递给代码优先的DbContext

Sha*_*ean 84 c# entity-framework database-connection

如何将连接字符串传递给实体框架的代码优先DbContext?当DbContext和web.config中的连接字符串位于同一个项目中并以相同的方式命名时,我的数据库生成正常工作.但是现在我需要将DbContext移动到另一个项目,所以我正在测试将连接字符串传递给它,如下所示:

模型与语境

public class Dinner
{
    public int DinnerId { get; set; }
    public string Title { get; set; }
}

public class NerdDinners : DbContext
{
    public NerdDinners(string connString)
        : base(connString)
    {
    }
    public DbSet<Dinner> Dinners { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

行动

    public ActionResult Index()
    {
        var db = new NerdDinners(ConfigurationManager.ConnectionStrings["NerdDinnerDb"].ConnectionString);

        var dinners = (from d in db.Dinners
                      select d).ToList();
        return View(dinners);
    }
Run Code Online (Sandbox Code Playgroud)

Web.Config中

<connectionStrings>
  <add name="NerdDinnerDb" connectionString="Data Source=|DataDirectory|NerdDinners.sdf" providerName="System.Data.SqlServerCe.4.0"/>    
</connectionStrings>
Run Code Online (Sandbox Code Playgroud)

如果我在操作中设置断点,则分析db,连接字符串就在那里,但它不会创建或查找数据库或任何东西.

建立与SQL Server的连接时发生与网络相关或特定于实例的错误.服务器未找到或无法访问.验证实例名称是否正确,以及SQL Server是否配置为允许远程连接.(提供者:命名管道提供程序,错误:40 - 无法打开与SQL Server的连接)

Bit*_*ler 83

比赛有点晚了,但另一个选择是:

public class NerdDinners : DbContext
{
    public NerdDinners(string connString)
    {
        this.Database.Connection.ConnectionString = connString;
    }
    public DbSet<Dinner> Dinners { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

  • 嗨!这是让我在某处的唯一解决方案.我的问题是我想从我的Azure配置文件而不是web.config中获取设置.但是,这种方式不起作用,因为缺少"提供者"设置(它被设置为web.config中的属性).有任何想法吗? (2认同)

Sha*_*ean 56

阅读文档后,我必须传递连接字符串的名称:

var db = new NerdDinners("NerdDinnerDb");
Run Code Online (Sandbox Code Playgroud)


Sud*_*hra 37

以为我会为那些寻找"如何将连接字符串传递给DbContext"的人添加此位:您可以为基础数据存储区构造连接字符串,并将整个连接字符串传递给从DbContext派生的类型的构造函数.

(重用@Lol Coder中的代码) 模型和上下文

public class Dinner
{
    public int DinnerId { get; set; }
    public string Title { get; set; }
}

public class NerdDinners : DbContext
{
    public NerdDinners(string connString)
        : base(connString)
    {
    }
    public DbSet<Dinner> Dinners { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

然后,假设您使用SqlConnectioStringBuilder构造一个Sql连接字符串,如下所示:

SqlConnectionStringBuilder builder = new SqlConnectionStringBuilder(GetConnectionString());
Run Code Online (Sandbox Code Playgroud)

GetConnectionString方法构造适当的连接字符串,SqlConnectionStringBuilder确保连接字符串语法正确; 然后你可以像这样实例化你的db conetxt:

var myContext = new NerdDinners(builder.ToString());
Run Code Online (Sandbox Code Playgroud)

  • 要真正硬编码我做的连接字符串:`public TestAppContext():base("Data Source = server.company.com; Initial Catalog = SomeDB; Integrated Security = True"){}` (4认同)

小智 27

In your DbContext, create a default constructor for your DbContext and inherit the base like this:

    public myDbContext()
        : base("MyConnectionString")  // connectionstring name define in your web.config
    {
    }
Run Code Online (Sandbox Code Playgroud)

  • 就我而言,它创建一个名为“MyConnectionString”的数据库...(是的,连接字符串存在)。我必须输入“name=MyConnectionString”。 (2认同)