Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/332.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 实体框架-与Orace和SQL Server交互_C#_Sql Server_Oracle_Entity Framework_Architecture - Fatal编程技术网

C# 实体框架-与Orace和SQL Server交互

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来构建数据访问层 我将非常感

我正在开发一个支持移动客户端的.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路径,您将非常高兴

最终,您必须权衡项目的考虑因素和备选方案提供的内容;ADO.NET为您的DB操作提供了最佳性能和自定义功能,它具有高度的可扩展性并允许优化,但编码需要更多的时间,而EF对于对象操作来说非常简单实用,尽管它在不断发展和改进,但它的性能和功能还不能与ADO.NET相匹配


关于驱动程序的问题,它不应该在这个问题上有太大的分量,因为即使是Oracle也鼓励您使用他们的驱动程序,而不是Microsoft提供的默认驱动程序。

非常全面的回答。谢谢!