C# 可插拔数据库层的建议

C# 可插拔数据库层的建议,c#,architecture,data-access-layer,C#,Architecture,Data Access Layer,我目前正在从事一个使用SQLServer数据库存储数据的软件项目。由于有一些计划要从SQLServer转移到Oracle,所以其中一个要求是构建可插拔的数据库层 因此,我的问题是,最好的方法是什么?我建议您在数据层中使用。有了它,您可以轻松地交换配置,以使用几乎任何您想要的数据库驱动程序 NHibernate对MsSQL和Oracle都有很好的支持 您可以用Hibernates查询语言(HQL)编写所有查询,该语言不受方言的影响。另一种选择是使用NHibernate3中的linq提供程序来获取强

我目前正在从事一个使用SQLServer数据库存储数据的软件项目。由于有一些计划要从SQLServer转移到Oracle,所以其中一个要求是构建可插拔的数据库层

因此,我的问题是,最好的方法是什么?

我建议您在数据层中使用。有了它,您可以轻松地交换配置,以使用几乎任何您想要的数据库驱动程序

NHibernate对MsSQL和Oracle都有很好的支持

您可以用Hibernates查询语言(HQL)编写所有查询,该语言不受方言的影响。另一种选择是使用NHibernate3中的linq提供程序来获取强类型数据访问

正如其他人提到的,我还建议使用repository模式并注入一个工作单元或SessionFactory

编辑:Oracle现在发布了实体框架提供商的测试版:

:Heading##

我建议使用,它比NHibernate更容易,而且成熟得很快。对于EF中的oracle支持,您需要


在使用实体框架的同时,我建议使用一种模式,比如存储库模式。通过这种方式,您可以使用依赖项注入来更改您选择的实现。您的应用程序独立于数据库或ORM本身。因此,如果您愿意,您也可以使用NHibernate。

如果您想采用ORM方式,您可以按照alexn的建议使用NHibernate,或者使用Telerik的OpenAccess ORM。oracle和其他DBMS也有EF提供程序,但它们不是免费的


如果您想从头开始构建整个DAL,那么可以使用存储库模式。为存储库创建接口,并为每个数据库创建每个存储库提供程序。”这是一场讨论。

你有很多选择。一种选择是使用各种对象关系映射器(ORM)框架之一。NHibernate是一个流行的,但是微软的实体框架(在v4中)也是一个合理的可能性,如果你感兴趣的话,它可以更好地与Linq集成


第二个选项(不一定排除上述选项)是实现类似于存储库模式的东西,并通过存储库层运行所有数据库访问。有些人认为ORM框架是存储库模式的替代品;其他人则看到存储库层在ORM框架之上增加了价值。存储库给您的真正价值是能够交换ORM层。只有您知道这是否是一个合理的可能性,即使是这样,实现额外的存储库级别可能比将所有内容重新绑定到新的ORM要做更多的工作。

NHibernate将是一个更好的选择,如果计划迁移到Oracle。实体框架,只有对Oracle的第三方支持,并且工作不太好。提供程序也不是免费的。所以我认为NHibernate是一条路,我完全同意你的看法。但即使是这种解决方案也无助于将业务逻辑放入存储过程的一般习惯。。。