开始情况:MS SQL中存在一个现有的数据库模式,它与MySQL中的现有模式完全相同(数据库优先 - 无法更改为广泛安装)。但是,它们在用于相应列的datatyoe中可能略有不同。必须通过C#访问该数据库系统。
问题:如何从应用程序的角度正确封装对这两者中的任何一个的访问,即程序员在查询MySQL或MSSQL数据库时一定不知道?
示例:我有一个表,比如MyTable,有一个bigint的主列“Id”和一个varchar的列“data”。
我的想法是使用EntityFramework(版本6)自动生成所有CRUD操作。所以我为MySQL和MSSQL创建了一个.edmx模型,我想将其注入逻辑层(即结果上下文)。但我注意到,在MySQL的情况下,Id(bigint)被映射到十进制,而在MS SQL中它被映射到long。现在我想知道这种EF方法是否合适,因为在两个数据库系统中同一(命名)列(同一命名表)有不同的数据类型。出于这个原因,同事倾向于自己编写所有语句,因为它是在遗留软件版本中完成的,即根本不使用EF,而是仅提供由MS SQL和MySQL的纯SQL实现的Facade方法。 / p>
但是我不喜欢自己编写所有的sql语句......
正如我上面提到的,我需要封装数据库访问 - 但是如果不同的数据库系统有不同的映射 - 如何正确地做到这一点?如果MSSQL和MySQL映射之间存在任何差异,我可以在EF模型前面构建一个外观并实现(数据类型,比如API)适配器,但是这种方法导致我认为抽象的抽象。
有什么建议吗?
答案 0 :(得分:0)
对于那些感兴趣的人:我们设法使用单个上下文,因为两个数据库结构几乎完全相同。只需要将相应的连接字符串传递给Entites(DbContext)构造函数。 所以有两个edmx模型:一个用于MySQL,一个用于MSSQL,而具体的模型类只在一侧(在我们的例子中是MSSQL)。