【问题标题】:Advice on changing an app to support multiple database backends关于更改应用程序以支持多个数据库后端的建议
【发布时间】:2015-04-28 19:14:30
【问题描述】:

我有一个用 C# 编写的应用程序,它目前混合使用数据集和一些使用 Advantage 数据库服务器的硬编码 SQL 语句/存储过程。

我现在希望我的应用程序也支持 MS-SQL。

我有几个选择:-

1) 分支源代码并手动进行语法更改以启用 MS-SQL 支持。这样做的缺点显然是多个代码库。

2) 将所有 DB 代码移动到 2 个单独的库中(一个用于 ADS,一个用于 MS-SQL),并根据 DB 为最终用户提供正确的库。我不确定如何设置它,理想情况下,我希望在我的 VS 解决方案中同时拥有两个库项目,并且能够在使用它们之间切换,最好是在调试和运行时。这可能吗?

3) 开始使用支持两个数据库后端的 DAL。如果我要开始使用 EF,是否可以最初基于现有的 ADS 数据库生成架构,然后在运行时将连接切换到使用相同架构的 MS-SQL 数据库,或者创建两个更好每个数据库的上下文/模式,并在运行时以某种方式切换它们,即是否可以创建一个通过配置设置返回相关上下文的方法,例如

dbcontext = new GetDBContext();

DbContext  GetDBContext()
{
   if( configsetting == "ADS")

      return new AdsDBContext();

   else

     return new MSSQLDBContext();

}

我想做的是进行增量更改,以便程序继续在现有 ADS 数据库上运行,同时慢慢适应 MS-SQL/其他数据库后端。

问候

迈克

【问题讨论】:

    标签: c# .net sql-server entity-framework advantage-database-server


    【解决方案1】:

    第一种情况是一个糟糕的选择。 最好的方法是第三种情况,但首先您必须将所有原始语句/查询转换为 ORM。这可能很困难。这取决于它们的复杂性、现有模型结构和 ORM 的局限性。这种方式很可能会失败,因为最终您需要重写项目的重要部分(再次取决于现有代码的结构)。如果没有,那就这样走,否则第二种情况是中庸之道。

    【讨论】:

    • 除了darkArk链接还有一个不错的帖子stackoverflow.com/questions/3080601/…
    • 我仍在考虑选项 3 是否值得加重,尽管对于我的应用程序的某些部分,我使用 AdsExtendedReader 类来导航访问数据。为了在 MS-SQL 上运行,无论如何都需要重写。
    • 只要创建了相同的 MS-SQL 数据库,是否可以通过更改连接字符串来切换从我的 ADS 数据库创建的实体模型到使用 MS-SQL 数据库?
    • 不幸的是,我不熟悉 ADS。即使您创建“相同”的数据库,您也可能会面临 SQL 方言差异的问题,除非您的所有 SQL 语句/查询都很简单并且不使用 ADS 特定的功能。
    • 我不打算使用除少数 SP 之外的任何 ADS 特定功能,但我会改为使用 MS-SQL。 EF 不会处理 SQL 的生成吗?
    【解决方案2】:

    如果您的应用程序不太复杂,我建议使用DbProviderFactoryclass。 Here 您将找到有关如何注册 .NET 提供程序以及如何使用它们的分步示例。 希望对您有所帮助。

    【讨论】:

    • @AceGrace 不幸的是,我不能只对自己的帖子发表评论,所以我会把它放在这里。实体框架是一个棘手的野兽:)。你说你想生成数据库模式,在运行时你想根据需要更改连接字符串,请参阅thisthis
    • 您好,感谢您的链接。我不需要在运行时更改连接字符串,所以我想(如果可行的话)我可以根据客户是使用 ADS 还是 MS-SQL 来更改 app.config 文件中的连接字符串?
    猜你喜欢
    • 2015-08-19
    • 2011-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-18
    • 2014-02-22
    • 2013-11-20
    • 2014-02-18
    相关资源
    最近更新 更多