c# - 如何让用户在 C# EF4.1 Code First 中动态指定数据库提供程序和连接详细信息?

标签 c# database ef-code-first connection-string

我正在创建一个 C# 应用程序来替换使用 MySQL 数据库的 VB6 应用程序,其中应用程序的多个副本使用相同的数据库。新应用程序必须能够使用当前的 MySQL 数据库,但我也希望它与数据库无关,以便应用程序的 future 实例可以使用用户想要的任何服务器。在一个完美的世界中,我希望应用程序在首次运行时向用户显示一个对话框,让他们选择数据库类型(MySQL、SQL Server 等...)并指定服务器 ip、用户、密码和数据库姓名。然后,该应用程序将连接到该服务器,如果数据库已经存在则使用该数据库,如果不存在则创建一个新数据库。

使用 Code First 我已经了解如何使用现有数据库或创建新数据库,但只能通过在 App.config 文件中对连接字符串进行硬编码。

    <add name="GumpIndexDatabase"
     connectionString="server=localhost;userid=123;password=123;port=3306;database=gump_new_data;pooling=false;"
     providerName="MySql.Data.MySqlClient"
     />

我可以在启动应用程序之前更改连接字符串和提供程序,一切都会按预期进行。我也可以在启动后更改连接字符串,但不能更改提供程序,而且我必须知道提供程序是 MySQL 还是 MSSQL 才能获得正确的连接字符串详细信息(例如:用户或用户 ID)

class GumpIndexDatabase: DbContext
{
    public GumpIndexDatabase(string connectionName)
        : base(MakeConnectionString(connectionName))
    {
    }
    private static string MakeConnectionString(string connectionName)
    {
         if (connectionName=MySQL) {
             //return MySQL string
         } else {
             //return SQL Server string
         }
    }

搜索了几个小时都没有找到如何做这样的事情的例子,所以我怀疑它是不允许或不推荐的,即使它看起来很简单。我看过一些关于连接字符串生成器的文章,但不明白如何从通用对象中获取特定于数据库的字符串。

那么简单的问题:如何在运行时指定数据库连接细节?

最佳答案

我不建议强制执行此功能,除非您 100% 肯定您不能没有它。它增加了很多维护任务,这些任务现在可能还不明显(例如更新到较新的版本、错误修复、花费大量时间找出通用接口(interface)、维护这些接口(interface)、 hell 般的大量测试等)。因此,除非它是一项请求的业务功能,否则请忽略它。

但是,如果您知道自己在做什么,这个问题通常可以通过接口(interface)来解决。可能有这些通用接口(interface)(这是自己的任务来弄清楚它们):

  • IConnection
  • IDataProvider
  • IRepository<T>

目前您将使用MySql 数据库实现接口(interface),例如class MySqlConnection : IConnection .如果您需要 MS SQL,class MsSqlConnection : IConnection .

实际上,您必须将所有功能抽象为公共(public)接口(interface)。您将必须为要支持的每个数据库/存储引擎提供实现。在运行时,您将使用 IoC 容器和 DI 原理来设置当前实现。所有子依赖项都将使用作为参数传递给构造函数(或属性或方法)的接口(interface)

关于c# - 如何让用户在 C# EF4.1 Code First 中动态指定数据库提供程序和连接详细信息?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15667702/

相关文章:

c# - 从数据库获取结果时防止循环引用

C# Windows 窗体应用程序在运行时被锁定

c# - 抛出异常时退出循环是否可以?

PHP 数据库部署 git/capistrano

entity-framework - Entity Framework 4.1 : The navigation property 'BusinessUser' declared on type 'Login' has been configured with conflicting multiplicities

ef-code-first - 使用共享主键关联时,EF 4.1 Code First 中的级联删除规则

c# - 为什么 C# 不允许泛型属性?

java - 从 Android Studio 连接到 SQL Server 2014

php - 使用php将数据从表单插入mysql数据库中的多个表

c# - 无法转换类型为 'System.Linq.EnumerableQuery` 1[Entities.Test ]' to type ' System.Data.Objects.ObjectQuery`1[Entities.Test]' 的对象