如果已经回答道歉,但经过2个小时的研究后,我还没有找到这个问题的明确答案。希望询问会产生结果。
我使用MVC和EF“比初学者好”,但我确实了解整体应用程序架构。您可以看到,对于更大的关注点和未来计划的更改,我想将我的MVC项目与实体框架分离。这是我到目前为止所拥有的:
我已经创建了我的Repository模式(在DataAccess项目中),并使用单独的UnitTest项目对其进行了测试。一切正常。
问题是,消费者(在这种情况下为UnitTest项目)仍然需要对Entity Framework的nuget引用(与MVC Web项目相同)。当我从我的Test项目中删除EF引用时(而是在将其传递到我的DataAccess项目时硬编码我的连接字符串)时,我收到此错误:
没有为ADO.NET提供程序找到具有不变名称“System.Data.SqlClient”的实体框架提供程序。确保提供程序已在应用程序配置文件的“entityFramework”部分中注册。
我如何设计这个,以便我可以从Repository使用者(UnitTest或MVC Web项目)中完全删除Entity Framework引用?我希望通过我的存储库完成所有工作,而MVC项目却不了解我的ORM技术。
这有点误导。首先,需要引用实体框架的原因是因为您将该库中的代码泄漏到MVC项目中。避免引用的唯一方法是100%隔离代码。这可能是可能的,但任何时候都不容易。但是,这并不重要。引用实体框架是没有意义的。 N层设计的重要部分是隔离不同的功能,不一定是参考。如果您的DAL依赖于EF并且您的MVC项目取决于您的DAL,那么您对EF有固有的依赖性。
问题是Visual Studio会删除项目中未使用的所有引用。这解决了我的问题:
public DbContext()
:base()
{
var a = System.Data.Entity.SqlServer.SqlProviderServices.Instance;
}
即使在删除NuGet包之后,您可能在与EF相关的配置(包和/或Web)中有剩余道具。它也值得检查你的csproj文件。您遇到的问题是您的配置中缺少这样的行。
<entityFramework>
...
<providers>
<provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
</providers>
</entityFramework>
话虽这么说,这仍然表明你的项目实际上是绑定到EF afaik。
您可以尝试通过Web API访问您的服务,Web API充当数据访问层的缓冲区,并作为匿名JSON对象来回传递的View Models中的交易。然后,您的前端(网站)可以完全与API背后的细节隔离,并充当它的客户端。 Angular JS / Angular(2)非常适合这种方法,因为我确信许多其他客户端技术都可以。