.net 在开发过程中是否有人在ORM解决方案之间进行过切换?

.net 在开发过程中是否有人在ORM解决方案之间进行过切换?,.net,orm,repository,.net,Orm,Repository,在我目前的工作中,我已经在EntityFramework和DbContext之上实现了Repository/UoW模式。我找到的唯一有效的理由是,如果您不想依赖某个特定的ORM解决方案。我只是想看看是否有人这样做过,在项目进行到一半的时候(比如说,一年之后),我决定:“天啊,我很高兴我实现了这个存储库模式,因为我需要从EntityFramework切换到NHibernate。”除了crud和一些带有连接的基本查询(使用LINQ)之外我觉得这种额外的抽象层很烦人,因为您必须在数据库中创建表、编写存

在我目前的工作中,我已经在EntityFramework和DbContext之上实现了Repository/UoW模式。我找到的唯一有效的理由是,如果您不想依赖某个特定的ORM解决方案。我只是想看看是否有人这样做过,在项目进行到一半的时候(比如说,一年之后),我决定:“天啊,我很高兴我实现了这个存储库模式,因为我需要从EntityFramework切换到NHibernate。”除了crud和一些带有连接的基本查询(使用LINQ)之外我觉得这种额外的抽象层很烦人,因为您必须在数据库中创建表、编写存储库、编写服务(如果您要使用典型的3层架构),以及必要的前端(如控制器和视图)

更新:


想知道以前是否有人在项目中切换过ORM,以及为什么切换?

您不必这样做。我不知道有哪一个项目真正切换了,而且切换实际上会包含很多工作。
如果你阅读,你会发现很多关于存储库的观点

这样做的唯一原因是当您正在开发一个框架时,该框架可以根据特定的用例与多个orm一起使用

此外,每个表都有一个存储库非常浪费开发人员的时间。
即使您使用存储库,拥有一个通用存储库和一些特定于实体的扩展也应该足够了


尽管如此,我仍然使用存储库,主要是因为我不喜欢在无关代码中直接引用第三方库。但这是一个偏好的问题,不是我能证明的最佳实践。

有很多Microsoft博客建议使用存储库模式

谷歌搜索“实体框架工作单元”可以支持这一点

我认为,要确保代码的可维护性和灵活性,更重要的是遵循可靠的原则。最具体的是界面分离模式。如果您是向接口编码,那么当您向接口编码时,数据存储库实现就变得无关紧要了

我有时使用Azure Blob存储来存储数据,因此我有两种接口实现:

IDtoEntityRepository

我从两个不同的数据存储中提取相同的数据类型,每个数据存储对处理数据有不同的要求。 因此,我最终实现了1个sql实现和1个azure blob存储实现。sql实现碰巧是用实体框架编码的,但我可以很容易地用Telerik的Orm编码一个新的类代码,名为:

TelerikOrmDtoEntityRepository

任何根据IDtoEntityRepository编码的类都不关心实现。通过这样做,我将所有数据层实现细节与调用代码分离。

只需创建交付快速测试和可靠功能代码所需的最小对象。此后,您可能会关心重构等问题,然后有一天,当您决定更改ORM工具时,您将玩弄诸如存储库和工作单元设计模式之类的机制

除此之外,如果您已经熟悉存储库模式,那么预测它的有用性可能是一个好主意,因为这不仅可以让您更改ORM工具,还可以在某些情况下直接使用ADO.NET

我相信依赖第三方工具,如ORM或类似工具并不坏,然后我认为您希望为评级最好的工具工作,例如NHibernate,我更喜欢它,而不是现有的任何其他ORM工具。这是我个人的看法


我所说的背后的想法不是编写一堆类,以防有一天您可能需要它们。如果实体模型存在,我可以在15-20分钟内创建一个基本的CRUD操作单元测试存储库。我不觉得那是浪费时间。如果您不同意,请参阅我的答案。对于CUD操作,一个通用存储库就足够了,为什么要创建更多。对于读取,您可能仍会以某种方式使用
IQueryable
,因为否则,需求的任何更改都需要在所有层中进行更改。这取决于存储库的复杂性。我非常喜欢通用存储库。大多数时候,我让调用代码控制事务范围以及何时提交到DB,但有时我想做一些类似于控制事务范围的事情,并说每个方法都隐式地调用我的DbContext上的SaveChanges()。这是一种通用存储库无法满足我的要求的情况。**注意:我链接的google搜索按去年进行筛选,只是为了表明此模式仍然是Microsoft推荐的,并非无关紧要。没有筛选的搜索显示了2009年和2008年的搜索结果,我不想让任何人认为结果中显示的文章已经过时,因此不相关。这一点很好。如果您需要具有不同持久性存储的特殊ORM或连接接口,这可能会很方便。这里要添加的另一个示例也是NoSQL解决方案。如果您真的想隐藏存储到何处的内容,这是很好的。如果你想要这个选项。雅格尼。目前,我没有使用遗留系统,也不打算添加任何其他外部持久性存储。如果我愿意的话,如果BLOB存储被证明比使用SQL Server更有用的话,它最有可能用于BLOB存储。在这种情况下,我可能想知道我实际上正在与哪个持久性存储接口。另一个原因是处理事务,如果混合使用多个映射工具,这将很难做到。