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

问题描述 投票:0回答:12

如何将连接字符串传递到实体框架的代码优先 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; }
}

行动

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

        var dinners = (from d in db.Dinners
                      select d).ToList();
        return View(dinners);
    }

Web.Config

<connectionStrings>
  <add name="NerdDinnerDb" connectionString="Data Source=|DataDirectory|NerdDinners.sdf" providerName="System.Data.SqlServerCe.4.0"/>    
</connectionStrings>

如果我在操作中设置断点并分析

db
,连接字符串就在那里,但它不会创建或查找数据库或任何内容。

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

c# entity-framework database-connection
12个回答
103
投票

这里的游戏有点晚了,但另一个选择是:

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

61
投票

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

var db = new NerdDinners("NerdDinnerDb");

39
投票

我想为那些来寻找“如何将连接字符串传递到 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; }
}

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

SqlConnectionStringBuilder builder = new SqlConnectionStringBuilder(GetConnectionString());

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

var myContext = new NerdDinners(builder.ToString());

30
投票

在 DbContext 中,为 DbContext 创建一个默认构造函数并继承基类,如下所示:

    public myDbContext()
        : base("MyConnectionString")  // connectionstring name define in your web.config
    {
    }

5
投票

来自这里

 protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    {
      optionsBuilder.UseSqlServer(ConfigurationManager.ConnectionStrings["BloggingDatabase"].ConnectionString);
    }

注意您可能需要添加

Microsoft.EntityFrameworkCore.SqlServer


3
投票

我有一个针对该问题的小解决方案示例。

MyDBContext.cs

 public MyDBContext(DBConnectionType ConnectionType) //: base("ConnMain")
  {
      if(ConnectionType==DBConnectionType.MainConnection)
       {
         this.Database.Connection.ConnectionString = ConfigurationManager.ConnectionStrings["ConnMain"].ConnectionString;
       }
      else if(ConnectionType==DBConnectionType.BackupConnection)
       {
         this.Database.Connection.ConnectionString = ConfigurationManager.ConnectionStrings["ConnBackup"].ConnectionString;
       }
  }

MyClass.cs

public enum DBConnectionType
 {
    MainConnection=0,
    BackupConnection=1
 }

frmMyForm.cs

 MyDBContext db = new MyDBContext(DBConnectionType.MainConnection);
                               //or
//MyDBContext db = new MyDBContext(DBConnectionType.BackupConnection);

2
投票

使用 EF 模型时,我在每个使用 EF 模型的项目中都有一个连接字符串。例如,我在单独的类库中有一个 EF EDMX 模型。我的 Web (mvc) 项目中有一个连接字符串,以便它可以访问 EF 数据库。

我还有另一个用于测试存储库的单元测试项目。为了使存储库能够访问 EF db,测试项目的 app.config 文件具有相同的连接字符串。

数据库连接应该配置,而不是编码,IMO。


2
投票

如果您要在应用程序中构建连接字符串,那么您将使用 connString 命令。如果您在 Web 配置中使用连接字符串。然后你使用该字符串的“名称”。


1
投票

检查 web.config 中连接字符串的语法。应该是这样的

ConnectionString="Data Source=C:\DataDictionary\NerdDinner.sdf"


0
投票

看不出你的代码有什么问题,我使用 SqlExpress,当我在构造函数中使用连接字符串时它工作正常。

您已经在项目中创建了 App_Data 文件夹,不是吗?


0
投票

对于来到这里尝试了解如何动态设置连接字符串的人,并在设置连接字符串时遇到上述解决方案的麻烦(例如“初始化字符串的格式不符合从索引 0 开始的规范。”)构造函数。这是解决方法:

public static string ConnectionString
{
    get {
        if (ConfigurationManager.AppSettings["DevelopmentEnvironment"] == "true")
            return ConfigurationManager.ConnectionStrings["LocalDb"].ConnectionString;
        else
            return ConfigurationManager.ConnectionStrings["ExternalDb"].ConnectionString;
    }
}

public ApplicationDbContext() : base(ConnectionString)
{
}

0
投票

您可以在 OnConfiguring 中设置连接字符串,如下所示:

 protected override void OnConfiguring(DbContextOptionsBuilderoptionsBuilder)
        {
 optionsBuilder.UseSqlServer("server=.;database=myDb;trusted_connection=true;");
        }
© www.soinside.com 2019 - 2024. All rights reserved.