开发者社区> 问答> 正文

实体框架6的动态MySQL数据库连接

我希望将动态连接字符串传递给实体框架上下文。我有150多个相同的模式(每个帐户一个),我想这样选择连接:

ApplicationDbContext db = new ApplicationDbContext("dbName"); 从理论上讲,这很容易,因为我可以创建一个connectionString并将其作为构造函数的参数传递,例如:

public ApplicationDbContext(string dbName) : base(GetConnectionString(dbName)) { }

public static string GetConnectionString(string dbName) { // The connectionString passed is something like: // Server=localhost;Database={0};Uid=username;Pwd=password var connString = ConfigurationManager .ConnectionStrings["MyDatabase"] .ConnectionString .ToString();

return String.Format(connString, dbName);

} 仅传递连接字符串名称时,我可以成功连接,但如下所示动态生成时,则不能成功。我现在意识到这是因为web.config中的连接字符串具有providerName="MySql.Data.MySqlClient"属性。

但是,当我将实际的连接字符串动态传递给该连接时,它假定它需要连接到SQL Server而不是MySQL,并且由于连接字符串无效而失败。

问题是,如果动态创建提供程序名称,该如何将其传递给连接字符串?

展开
收起
保持可爱mmm 2020-05-17 19:06:50 752 0
1 条回答
写回答
取消 提交回答
  • Entity Framework 6提供了一些方便的细微更改,这些更改有助于使MySQL正常工作并创建动态数据库连接。

    使MySQL与Entity Framework 6配合使用 首先,在我回答这个问题之日,与EF6兼容的唯一.Net连接器驱动程序是MySQL .Net Connectior 6.8.1(Beta开发版本),可以在此处访问官方MySQL网站。

    安装后,请从Visual Studio解决方案中引用以下文件:

    Mysql.Data.dll Mysql.Data.Entity.EF6.dll 您还需要将这些文件复制到在构建期间项目可以访问的位置,例如bin目录。

    接下来,您需要向Web.config(或基于桌面的App.config)文件中添加一些项目。

    连接字符串:

    还可以在 和 节点内添加提供程序(可选)(这是我的答案的第二部分中的绝对必需,在处理动态定义的数据库时),您可以更改 节点:

    如果从默认的sql服务器连接更改defaultConnectionFactory,请不要忘记删除 嵌套在defaultConnectionFactory节点中的节点。MysqlConnectionFactory的构造函数不接受任何参数,如果参数仍然存在,它将失败。

    在这个阶段,使用Entity连接到MySQL非常容易,您可以按名称引用上面的connectionString。请注意,如果按名称连接,即使该defaultConnectionFactory节点仍然指向SQL Server(默认情况下也是如此),此操作也将起作用。

    public class ApplicationDbContext: DbContext { public ApplicationDbContext() : base("mysqlCon") { } } 这只是正常连接的问题:

    ApplicationDbContext db = ApplicationDbContext(); 连接到动态选择的数据库名称 在这一点上,很容易连接到我们可以作为参数传递的数据库,但是我们需要做一些事情。

    重要的提示 如果还没有,如果希望动态连接到MySQL,则必须在Web.config中更改defaultConnectionFactory。由于我们将直接将连接字符串传递给上下文构造函数,因此除非在web.config中指定,否则它将不知道要使用哪个提供程序,并将转向其默认连接工厂。请参阅上面的操作方法。

    您可以像这样手动将连接字符串传递给上下文:

    public ApplicationDbContext() : base("Server:localhost;...") { } 但是,为了使其更容易一点,我们可以在设置mySQL时对上面所做的连接字符串进行一些小的更改。只需添加一个占位符,如下所示:

    现在,我们可以构建一个辅助方法并更改ApplicationDbContext类,如下所示:

    public class ApplicationDbContext: DbContext { public ApplicationDbContext(string dbName) : base(GetConnectionString(dbName)) { }

    public static string GetConnectionString(string dbName)
    {
        // Server=localhost;Database={0};Uid=username;Pwd=password
        var connString = 
            ConfigurationManager.ConnectionStrings["mysqlCon"].ConnectionString.ToString();
    
        return String.Format(connString, dbName);
    }
    

    } 如果使用数据库迁移,则以下步骤很重要 如果使用迁移,则会发现ApplicationDbContext将由框架传递给您的Seed方法,并且将失败,因为它将不会传递我们为数据库名称输入的参数。

    将以下类添加到上下文类的底部(或其他位置)以解决该问题。

    public class MigrationsContextFactory : IDbContextFactory { public ApplicationDbContext Create() { return new ApplicationDbContext("developmentdb"); } } 现在,您的代码优先迁移和种子方法将针对developmentdbMySQL数据库中的架构。

    希望这可以帮助某人:)来源:stack overflow

    2020-05-17 19:07:05
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
One Box: 解读事务与分析一体化数据库 HybridDB for MySQL 立即下载
One Box:解读事务与分析一体化数据库HybridDB for MySQL 立即下载
如何支撑HTAP场景-HybridDB for MySQL系统架构和技术演进 立即下载

相关镜像