数据库优先和实体框架动态连接字符串

本文关键字:动态 连接 字符串 框架 实体 数据库 | 更新日期: 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)#>
    <#
        }
    }
    #>
    }

这将允许分部类按预期工作。