【发布时间】:2015-01-07 22:55:41
【问题描述】:
为已部署的桌面 wpf 应用程序使用数据库优先范式(不是代码优先)的目标,并为最终用户提供独特的数据库:
1) 让 EntityFramework 使用在运行时确定的连接字符串。
2) 不部署不同的 app.config 文件。
尝试的事情:
1) 重载构造函数 - 虽然成功,但此解决方案并不受欢迎,因为它为开发人员犯错敞开了大门,使单元测试更加困难。
2) 尝试修改连接/上下文工厂 - 抛出异常。
3) 更改默认构造函数 - 可能会成功,但此解决方案是不受欢迎的,因为默认构造函数是自动生成的。
4) 尝试修改 ConfigurationSettings - 抛出异常,它是只读的。
5) 有一个 app.config 的客户端部署 - 虽然看似合理,但这个解决方案是不受欢迎的,因为它需要重写我们的部署引擎。
帮助?
编辑: 一些与我们尝试的第一项相关的代码(重载构造函数):
public partial class DatabaseContext
{
public DatabaseContext(EntityConnection con)
: base(con, true)
{
}
}
public static class DbContextHelper
{
public static string ConnectionString { get; set; }
public static CounterpartDatabaseContext GetDbContext()
{
EntityConnectionStringBuilder builder = new EntityConnectionStringBuilder
{
Provider = "System.Data.SqlClient",
ProviderConnectionString = ConnectionString,
Metadata = @"res://*/DatabaseContext.csdl|res://*/DatabaseContext.ssdl|res://*/DatabaseContext.msl"
};
EntityConnection con = new EntityConnection(builder.ToString());
return new DatabaseContext(con);
}
}
用法:
public void SomeMethod()
{
using(DatabaseContext db = DbContextHelper.GetDbContext())
{
// db things
}
}
使用配置管理器添加连接字符串的编辑代码:
public MainWindow()
{
InitializeComponent();
ConfigurationManager.ConnectionStrings.Add(new ConnectionStringSettings("DatabaseContext", @"metadata=res://*/DatabaseContext.csdl|res://*/DatabaseContext.ssdl|res://*/DatabaseContext.msl;provider=System.Data.SqlClient;provider connection string="data source=sqldev;initial catalog=Dev;persist security info=True;user id=user;password=password;MultipleActiveResultSets=True;App=EntityFramework"", "System.Data.EntityClient"));
}
配置管理器代码只是抛出一个异常,因此之后的任何代码都没有意义。
【问题讨论】:
-
很高兴您告诉我们您尝试了什么,但您应该向我们展示一些示例。毕竟,我们是程序员,我们想看代码:)
-
不再有工厂更改的代码(因为它抛出异常从未提交更改)。
标签: c# wpf entity-framework dynamic connection-string