如何将连接字符串传递给实体框架的代码优先 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);
}
网络配置
<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 的连接)
这里的游戏有点晚了,但另一种选择是:
public class NerdDinners : DbContext
{
public NerdDinners(string connString)
{
this.Database.Connection.ConnectionString = connString;
}
public DbSet<Dinner> Dinners { get; set; }
}
阅读文档后,我必须改为传递连接字符串的名称:
var db = new NerdDinners("NerdDinnerDb");
以为我会为那些寻找“如何将连接字符串传递给 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 Connection 字符串,如下所示:
SqlConnectionStringBuilder builder = new SqlConnectionStringBuilder(GetConnectionString());
GetConnectionString 方法构造适当的连接字符串,而 SqlConnectionStringBuilder 确保连接字符串在语法上是正确的;然后,您可以像这样实例化您的 db conetxt:
var myContext = new NerdDinners(builder.ToString());
public TestAppContext() : base("Data Source=server.company.com;Initial Catalog=SomeDB;Integrated Security=True") { }
在您的 DbContext 中,为您的 DbContext 创建一个默认构造函数并像这样继承基础:
public myDbContext()
: base("MyConnectionString") // connectionstring name define in your web.config
{
}
MyConnectionString
... 的数据库(是的,连接字符串存在)。我必须输入 name=MyConnectionString
。
对于该问题,我有一个小解决方案示例。
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;
}
}
我的类.cs
public enum DBConnectionType
{
MainConnection=0,
BackupConnection=1
}
frmMyForm.cs
MyDBContext db = new MyDBContext(DBConnectionType.MainConnection);
//or
//MyDBContext db = new MyDBContext(DBConnectionType.BackupConnection);
如果您在应用程序中构建连接字符串,那么您将使用 connString 命令。如果您在 Web 配置中使用连接字符串。然后使用该字符串的“名称”。
检查 web.config 中连接字符串的语法。它应该类似于 ConnectionString="Data Source=C:\DataDictionary\NerdDinner.sdf"
使用 EF 模型时,我在每个使用 EF 模型的项目中都有一个连接字符串。例如,我在一个单独的类库中有一个 EF EDMX 模型。我的 web (mvc) 项目中有一个连接字符串,以便它可以访问 EF 数据库。
我还有另一个用于测试存储库的单元测试项目。为了让存储库访问 EF db,测试项目的 app.config 文件具有相同的连接字符串。
数据库连接应该配置,而不是编码,IMO。
来自here
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
optionsBuilder.UseSqlServer(ConfigurationManager.ConnectionStrings["BloggingDatabase"].ConnectionString);
}
请注意,您可能需要添加 Microsoft.EntityFrameworkCore.SqlServer
看不出你的代码有什么问题,我使用 SqlExpress,当我在构造函数中使用连接字符串时它工作正常。
您已经在项目中创建了一个 App_Data 文件夹,不是吗?
对于任何来到这里尝试了解如何设置连接字符串的人,并且在设置连接字符串时遇到了上述解决方案(例如“初始化字符串的格式不符合从索引 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)
{
}
Manual changes to this file will be overwritten if the code is regenerated.
,则可能希望按照 Partial Classes and Methods (C# Programming Guide) 在部分类中实现这一点