数据库优先和实体框架动态连接字符串
本文关键字:动态 连接 字符串 框架 实体 数据库 | 更新日期: 2024-10-30 12:14:02
在我的 WPF 应用(数据库优先 EF)中,我需要为用户提供一种在运行时更新/修改数据库连接字符串(位于 azure )的方法。我通过添加以下方法来扩展自动生成的MyContext
部分类。但是我收到错误
已存在具有相同签名的方法
添加动态连接字符串的正确过程是什么?
感谢
错误信息:
类型"MyServDataCollection.Models.MyContext"已经定义了一个名为"MyContext"的成员,具有相同的参数类型
MyContext
类
using System.Data.Entity;
using System.Data.Entity.Core.EntityClient;
public partial class MyContext : DbContext
{
public MyContext() : base(GetConnectionString())
{
}
private static string GetConnectionString()
{
var model = "MyServDataCollectionModel";
var providerConnectionString = "metadata=res://*/Models.MyServDataCollectionModel.csdl|res://*/Models.MyServDataCollectionModel.ssdl|res://*/Models.MyServDataCollectionModel.msl;provider=System.Data.SqlClient;provider connection string="data source=xxx.database.windows.net;initial catalog=xxxx;persist security info=True;user id=xxxxxxx;password=xxxxx;MultipleActiveResultSets=True;App=EntityFramework"";
var efConnection = new EntityConnectionStringBuilder();
efConnection.Provider = "System.Data.SqlClient";
efConnection.ProviderConnectionString = providerConnectionString;
// based on whether you choose to supply the app.config connection string to the constructor
efConnection.Metadata = string.Format("res://*/Model.{0}.csdl|res://*/Model.{0}.ssdl|res://*/Model.{0}.msl", model);
// Make sure the "res://*/..." matches what's already in your config file.
return efConnection.ToString();
}
此错误消息是正确的。无参数构造函数已经包含在生成的分部类(由Visual Studio生成)中。若要使用自定义连接字符串进行连接,只需使用连接字符串(或配置键 - 请参阅帮助)调用构造函数。我认为这个构造函数已经生成,但如果不是,那么您可以简单地创建它,将以下代码添加到您的分部类中:
public partial class MyContext : DbContext
{
public MyContext(string connectionStringOrKey)
: base(connectionStringOrKey)
{
}
}
方法GetConnectionString()只能使用公共而不是私有创建。
然后只需致电
MyContext myCtx = new MyContext(MyConnection.GetConnectionString())
例如。另一种解决方案是使用添加静态方法CreateMyContext修改分部类:
public partial class MyContext : DbContext
{
private static string GetConnectionString()
{
}
public static MyConnection CreateMyContext()
{
return new MyContext(MyContext.GetConnectionString());
}
}
在这种情况下,但最好将这些方法放到另一个类(扩展类?
如果要允许使用代码继续使用无参数构造函数来创建 DBContext 的实例,则可以修改 T4 模板以确保自动生成的类不会定义无参数构造函数:
从 MyContext.Context.tt 文件中删除以下内容:
public <#=code.Escape(container)#>()
: base("name=<#=container.Name#>")
{
<#
if (!loader.IsLazyLoadingEnabled(container))
{
#>
this.Configuration.LazyLoadingEnabled = false;
<#
}
foreach (var entitySet in container.BaseEntitySets.OfType<EntitySet>())
{
// Note: the DbSet members are defined below such that the getter and
// setter always have the same accessibility as the DbSet definition
if (Accessibility.ForReadOnlyProperty(entitySet) != "public")
{
#>
<#=codeStringGenerator.DbSetInitializer(entitySet)#>
<#
}
}
#>
}
这将允许分部类按预期工作。