C# 实体框架-与Orace和SQL Server交互
我正在开发一个支持移动客户端的.NET web api服务(支持Odata)。该服务应同时支持Oracle和SQL server数据库,但一次只能使用一种数据库类型,根据客户端使用的数据库技术 如何创建与数据库无关的数据访问层?不要编写两次代码—一次用于SQL server,一次用于Oracle 另外,似乎为了在EF中支持oracle,需要使用第三方oracle驱动程序—来自devart或oracle的ODP.NET 我在争论我应该使用老式的ADO.NET还是使用EF来构建数据访问层 我将非常感谢在这方面的任何帮助C# 实体框架-与Orace和SQL Server交互,c#,sql-server,oracle,entity-framework,architecture,C#,Sql Server,Oracle,Entity Framework,Architecture,我正在开发一个支持移动客户端的.NET web api服务(支持Odata)。该服务应同时支持Oracle和SQL server数据库,但一次只能使用一种数据库类型,根据客户端使用的数据库技术 如何创建与数据库无关的数据访问层?不要编写两次代码—一次用于SQL server,一次用于Oracle 另外,似乎为了在EF中支持oracle,需要使用第三方oracle驱动程序—来自devart或oracle的ODP.NET 我在争论我应该使用老式的ADO.NET还是使用EF来构建数据访问层 我将非常感
谢谢 你的问题似乎围绕着多个问题,我将根据我对这些问题的看法给出答案: 1.-?如何创建与数据库(DB引擎)无关的DAL 答:一种方法是遵循模式和/或使用接口将处理数据的代码与检索/插入数据的代码解耦。代码用于获取数据的接口的实际实现也可以被定义为不依赖于DB引擎,如果您要使用ADO.NET,您可以查看一些非常有用的代码,这些代码是不依赖于DB引擎的。Entity Framework还与不同的DB引擎兼容,但正如您所提到的,一次只能与一个DB交互,因此无论何时生成模型,都要将其与承载DB的DB引擎的细节联系起来。这与您问题中的另一个问题有关: 2.-?您应该使用普通的旧ADO.NET还是EF 答:这是一个非常好的问题,我相信之前已经问过很多次了,并且考虑到这两种方法都能为您提供相同的检索和操作数据的实际结果,因此产生的问题是:?您个人对编码的偏好以及项目的时间/资源限制是什么 在IMO中,实体框架最适合代码优先的项目,并且当您的业务逻辑不需要复杂的日志记录、事务和数据库端的其他安全或性能约束时,这不是因为EF不能包含这些要求,但因为它变得相当复杂和不现实,我个人认为这违背了EF的目的,为您提供了一个允许快速开发的工具 因此,如果参与项目的人员不太习惯用SQL编写存储过程,并且数据操作主要围绕您的服务进行,而不需要在数据库端执行非常复杂的操作,那么EF是一种合适的方法,您可以利用存储库模式和接口来实现“DBContext”对象,该对象将允许您创建与DB无关的DAL 但是,如果您需要实现事务、安全性、大量日志记录,并且更适合编写SQL存储过程,则实体框架通常会成为您的负担,因为它还不适合高级任务,例如:
- 假设您有一个用户表,其中有多个字段(地址、电话等),并非所有与用户相关的操作(如身份验证)都需要这些字段;尝试将实体映射到不返回该实体包含的任何字段的存储过程的结果将导致错误,并且您可能需要在SP中创建具有更多或更少成员的不同模型,或者返回特定操作可能不需要的其他列,从而增加带cons的带宽不必要的浪费
- 另一种情况是利用SQL Server中的表值参数等功能来优化同时向数据库发送多个记录,在这种情况下,Entity Framework不包含任何将自动优化多个记录操作的内容,因此为了使用TVPs,您需要手动定义该操作如果您使用ADO.NET路径,您将非常高兴
关于驱动程序的问题,它不应该在这个问题上有太大的分量,因为即使是Oracle也鼓励您使用他们的驱动程序,而不是Microsoft提供的默认驱动程序。非常全面的回答。谢谢!