Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.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
Entity framework 存储库和工作单元模式的使用(重温)。。。在EF Core中使用ASP.NET Core_Entity Framework_Asp.net Core_.net Core - Fatal编程技术网

Entity framework 存储库和工作单元模式的使用(重温)。。。在EF Core中使用ASP.NET Core

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

我是以下的EF核心与ASP.NET核心。有趣的是,本文指出“对于使用EF的应用程序来说,使用存储库和工作单元模式并不总是最佳选择”,但在EF 5的教程中,存储库和工作单元模式的使用仍然得到了推广,即使有单独的教程部分

阅读stackoverflow,据报道,应用它的原因主要是为了测试(依赖注入)


在本教程的进一步阅读中,提到“实体框架核心实现了一个可用于测试的内存中数据库提供程序”。我想这是一个新特性,在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数据库,内存中的提供程序不是其中之一。你永远不会在现实世界中使用它。