我正在创建一个 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/