【问题标题】:Support both MS-SQL and Oracle支持 MS-SQL 和 Oracle
【发布时间】:2016-11-28 02:14:44
【问题描述】:

我开发了一个企业产品,目前在一些网站上运行。这是在 MS 堆栈上开发的,使用 SQL 服务器作为后端数据存储。 我没有使用 EF/NHibernate 进行数据访问,而是使用了 dapper 和一些相同的自定义扩展。这对我们来说效果很好,因为大多数 我们拥有的查询是跨多个表的复杂聚合和过滤器。拥有自定义 SQL 大大减少了我们在识别瓶颈和更快地修复它方面的工作量。

现在由于某些业务原因,我们需要为一位大客户支持 oracle(我们无法让他们使用 SQL,因为他们是一家完整的 oracle 商店)。

假设我需要更改许多数据类型以确保跨数据库的一致性,如果我能获得有关整体方法的一些指导会很有帮助

  1. 最好的方法是什么,以便我可以支持对两个数据源的查询

    • 方法 1: 尝试将大部分查询转移到 ANSI SQL,并且只对一些专门的查询进行单独的查询

    • 方法 2: 结合使用 EF 和 Dapper。 EF 将用于更简单的操作,而 dapper 将用于繁重的读取操作。无论何时再次使用 dapper,都可能需要对 oracle 和 sql 进行单独查询

    • 方法 3: 继续使用 Dapper 并对所有操作进行单独查询

2) 我有用于数据库部署自动化的 dacpac。我如何为 oracle 实现同样的目标?

除了这些之外,在支持这两个数据库时,我还需要注意哪些其他事项,例如处理日期时间、货币等?

【问题讨论】:

    标签: c# sql-server entity-framework repository-pattern dapper


    【解决方案1】:

    当您开始使用 EF 进行开发并且所有表都有 POCO 类时,我更喜欢方法 3。

    因此,使用 Dapper 构建 Oracle 环境(使用您使用 Ms SQL Server 生成的 POCO)。

    您可以将 DAL 构建为存储库模式、工作单元

    随手记录,oracle /sql 服务器之间的数据类型不匹配,并进行必要的更正以统一 DAL。

    对你的 DAL 进行单元测试,应该在 Oracle/SQL Server 中通过,你是安全的。

    编辑2:

    由于您拥有使用 SQL Server 的工作系统,并最大限度地减少了开发时间,因此请研究 Alternative 4 :) 解决方案“将 EntityFramework 与 Oracle 数据库结合使用”。 看看:

    Can you use Microsoft Entity Framework with Oracle?

    http://download.oracle.com/oll/obe/EntityFrameworkOBE/EntityFrameworkOBE.htm

    您可以为该解决方案制作 POC(概念证明)。

    https://www.nuget.org/packages/Oracle.ManagedDataAccess.EntityFramework/

    安装包 Oracle.ManagedDataAccess.EntityFramework

    迁移到 oracle 数据库的步骤:

    使用 Oracle Migration Workbench 将 MS SQL Server 数据库迁移到 oracle 数据库

    更多详情:

    http://www.oracle.com/technetwork/topics/o57sql-100253.html

    该工具使您能够迁移所有对象,包括架构对象、表、触发器和存储过程,并处理数据类型转换。 要了解数据类型之间的映射,请阅读:

    https://www.mssqltips.com/sqlservertip/2944/comparing-sql-server-and-oracle-datatypes/

    快速迁移应用程序以使用 Oracle 数据库

    迁移数据库后,您使用 Dapper,修改连接字符串并开始测试您的应用程序,查找所有错误(不要一一调试)到所有更改的副作用。

    我预计应用程序会有非常小的变化(如果不能按原样工作)。

    计划变革。

    您可以在 共享项目 中使用 dapper 移动所有 DAL(如果您正在使用 vs 2013/2015),您当前使用 Sql Server 的应用程序和使用 Oracle 的新应用程序都可以引用它数据库。

    在这种情况下,您的 DAL 仅包括与连接字符串和共享项目的连接类。

    oracle/Ms Sql Server 的单元测试

    1) 创建共享项目t,其中包括对 oracle 和 Ms sqL 服务器的所有常见测试。

    2) 为 Ms Sql Server 创建单元测试项目,引用共享项目,定义连接字符串,添加其他测试(以防实现中存在一些差异)。

    3) 为 oracle 创建单元测试项目,就像我们在步骤 2 中所做的那样

    4) 运行两个测试并确保所有测试都通过 对于任何更改,请再次运行测试。

    【讨论】:

    • @m-hassan,如果理解正确,您的建议是有 EF POCO 类,但对 SQL 和 oracle 分别使用 dapper?我同意使用集成测试套件来测试跨 sql 和 oracle 的数据访问是没有办法的
    • 我编辑并提供备选方案 4,将 EF 与 Oracle 结合使用
    • @m-hassan,非常了解 EF,我认为当我有一些复杂的查询时它不会很好用。所以看起来我需要致力于 EF 和 Dapper 的工作,以尽量减少查询的重复。
    • @m-hassan,您对部署自动化有什么建议吗?
    • 好的,很好。现在你考虑一下oracle和sql server的(通用单元测试套装)
    【解决方案2】:

    如果您对数据访问层进行测试,我会选择方法 1。

    【讨论】:

    • 我没有对数据访问进行测试,但我认为现在是我唯一能负担得起重构和添加测试用例的时间。没有它们,我将寻找@无尽的兼容性问题
    • 很高兴听到单元测试的重要性。顺便说一句,编码前的测试(它是怎么来的:))
    猜你喜欢
    • 1970-01-01
    • 2010-09-06
    • 1970-01-01
    • 1970-01-01
    • 2011-04-28
    • 2017-04-12
    • 1970-01-01
    • 2014-04-30
    • 1970-01-01
    相关资源
    最近更新 更多