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

时间:2016-08-22 13:07:00

标签: c# asp.net-mvc entity-framework architecture repository-pattern

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

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

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

我已经创建了我的Repository模式(在DataAccess项目中),并使用单独的UnitTest项目对其进行了测试。一切正常。

问题是,消费者(在这种情况下为UnitTest项目)仍然需要nuget 引用到Entity Framework(与MVC Web项目相同)。当我从我的测试项目中删除EF引用时(而是在将其传递到我的DataAccess项目时硬编码我的连接字符串)时,我收到此错误:

  

找不到ADO.NET提供程序的实体框架提供程序   不变名称'System.Data.SqlClient'。确保提供商是   在应用程序配置的'entityFramework'部分注册   文件。

我如何设计这个,以便我可以从Repository使用者(UnitTest或MVC Web项目)中完全删除实体框架参考?我希望通过我的存储库完成所有工作,而MVC项目却不了解我的ORM技术。

4 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:1)

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

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

答案 2 :(得分:0)

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

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

话虽如此,这仍然表明您的项目实际上已经与EF afaik绑定。

答案 3 :(得分:0)

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