从MVC项目中删除实体框架参考

问题描述 投票:4回答:4

如果已经回答道歉,但经过2个小时的研究后,我还没有找到这个问题的明确答案。希望询问会产生结果。

我使用MVC和EF“比初学者好”,但我确实了解整体应用程序架构。您可以看到,对于更大的关注点和未来计划的更改,我想将我的MVC项目与实体框架分离。这是我到目前为止所拥有的:

  • 模型项目(充满注释良好的POCO,作为容器,没有业务逻辑)
  • DataAccess项目(引用我的模型项目和实体框架)
  • MVC Web项目(仅引用我的Models项目)

我已经创建了我的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技术。

c# asp.net-mvc entity-framework architecture repository-pattern
4个回答
3
投票

这有点误导。首先,需要引用实体框架的原因是因为您将该库中的代码泄漏到MVC项目中。避免引用的唯一方法是100%隔离代码。这可能是可能的,但任何时候都不容易。但是,这并不重要。引用实体框架是没有意义的。 N层设计的重要部分是隔离不同的功能,不一定是参考。如果您的DAL依赖于EF并且您的MVC项目取决于您的DAL,那么您对EF有固有的依赖性。


1
投票

问题是Visual Studio会删除项目中未使用的所有引用。这解决了我的问题:

public DbContext() 
    :base()
{
   var a = System.Data.Entity.SqlServer.SqlProviderServices.Instance;
}

0
投票

即使在删除NuGet包之后,您可能在与EF相关的配置(包和/或Web)中有剩余道具。它也值得检查你的csproj文件。您遇到的问题是您的配置中缺少这样的行。

<entityFramework>
    ...    
    <providers>
        <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
    </providers>
</entityFramework>

话虽这么说,这仍然表明你的项目实际上是绑定到EF afaik。


0
投票

您可以尝试通过Web API访问您的服务,Web API充当数据访问层的缓冲区,并作为匿名JSON对象来回传递的View Models中的交易。然后,您的前端(网站)可以完全与API背后的细节隔离,并充当它的客户端。 Angular JS / Angular(2)非常适合这种方法,因为我确信许多其他客户端技术都可以。

© www.soinside.com 2019 - 2024. All rights reserved.