Entity framework 存储库和工作单元模式的使用(重温)。。。在EF Core中使用ASP.NET Core
我是以下的EF核心与ASP.NET核心。有趣的是,本文指出“对于使用EF的应用程序来说,使用存储库和工作单元模式并不总是最佳选择”,但在EF 5的教程中,存储库和工作单元模式的使用仍然得到了推广,即使有单独的教程部分 阅读stackoverflow,据报道,应用它的原因主要是为了测试(依赖注入)Entity framework 存储库和工作单元模式的使用(重温)。。。在EF Core中使用ASP.NET Core,entity-framework,asp.net-core,.net-core,Entity Framework,Asp.net Core,.net Core,我是以下的EF核心与ASP.NET核心。有趣的是,本文指出“对于使用EF的应用程序来说,使用存储库和工作单元模式并不总是最佳选择”,但在EF 5的教程中,存储库和工作单元模式的使用仍然得到了推广,即使有单独的教程部分 阅读stackoverflow,据报道,应用它的原因主要是为了测试(依赖注入) 在本教程的进一步阅读中,提到“实体框架核心实现了一个可用于测试的内存中数据库提供程序”。我想这是一个新特性,在EF5的时候是不存在的。这是否意味着几乎没有任何理由再在EF Core和ASP.NET Co
在本教程的进一步阅读中,提到“实体框架核心实现了一个可用于测试的内存中数据库提供程序”。我想这是一个新特性,在EF5的时候是不存在的。这是否意味着几乎没有任何理由再在EF Core和ASP.NET Core中应用存储库和工作单元模式了?这里有这么多混乱的原因和历史。EF的
DbContext
用于不实现接口,因此它使模拟难以用于测试目的。然而,这在EF6中得到了纠正,因此从那时起,使用存储库/工作单元模式绝对没有任何好处,即使是出于测试目的
EF Core是完全可测试的端到端,并且现在还有一个内存中的数据库提供程序,这意味着您甚至不需要对它进行模拟,尽管如果您愿意,您可以进行模拟
长和短,转储存储库和工作单元模式。它们从来都不是一个好的解决方案,即使它们在测试中有一些用途,而且自从EF 6以来,它们已经完全无用了
现在。。。让火焰之战开始吧。
DbContext
是工作单元,DbSet
是存储库。您可以围绕EF实现这些模式的更传统版本,但最终只会得到一堆包装器类。这对任何开发人员来说都应该是一个危险信号。@CoffeCold使用实体框架时不需要存储库或UOW模式,Chris Pratt的回答是一个很好的建议,EF上下文是一个抽象,用于依赖项注入和交换数据库。Brad的建议也很好,你只需要在EF第一次尝试为你做的伟大的DB抽象中隐藏一堆包装类就可以了place@Brad当前位置你的评论的第一部分是正确的,尽管我强烈不同意后面的部分。EF核心是基础设施,你不应该把它散布到你的代码中,因为这会导致你所有的层都依赖于EF/EF核心,它是。。。也很糟糕。基本上,这是一种选择,要么选择清晰的层分离,要么牺牲一些EF/EF核心的ORM特性。EF6有没有真正好的DbContext
模拟解决方案?我所说的“好”是指模仿所有数据库行为的行为,如标识列、FK/PK约束和导航属性的标准填充。我已经看到(并实现)了一些选项,但没有一个能满足所有要求。我认为Core有内存提供程序,它可以完成所有这一切,但Core似乎离成为EF6的功能替代品还有很长的路要走。事实上,EF Core的功能非常完整。2.0在添加大多数缺少的功能方面走了很长的路。剩下的内容主要在2.1(预览版)中介绍。就模拟而言,EF确实在幕后做了很多事情,所以不管有没有抽象层,模拟总是一件难事。但是,内存中的提供程序非常好,可以完美地用于测试。@BradleyUffner:您有用于集成测试的内存提供程序,它在内存数据库中不是关系数据库,因此它不强制执行索引和唯一性,FK/PK关系等。如果您想要更接近关系数据库,则必须在内存模式下使用Sqlite进行集成测试。这是官方推荐的@Tseng感谢您提供的信息。我不知道内存中缺少这些特性。我不认为内存提供程序是集成测试。事实上,这就是重点所在。您知道,集成测试实际上应该测试应用程序正在使用的组件的集成,例如SQL Server数据库,内存中的提供程序不是其中之一。你永远不会在现实世界中使用它。