从MVC项目中删除实体框架引用

本文关键字:实体 框架 引用 删除 MVC 项目 | 更新日期: 2023-09-27 18:03:30

如果这个问题已经得到了回答,我很抱歉,但是经过2个小时的研究,我还没有找到这个问题的明确答案。

我对MVC和EF"比初学者好一点",但我确实了解整个应用程序架构。您看,为了更大的关注点分离和未来计划的更改,我想将从实体框架中解耦我的MVC项目。以下是目前为止的内容:

  • 模型项目(充满注释良好的poco,作为容器,没有业务逻辑)
  • 数据访问项目(参考我的模型项目,和实体框架)
  • MVC Web项目(只引用我的模型项目)

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

问题是,消费者(在这种情况下是UnitTest项目)仍然需要一个nuget 对实体框架的引用(与MVC Web项目相同)。当我从我的Test项目中删除EF引用时(而是在将连接字符串传递到我的DataAccess项目时硬编码它),我得到了这个错误:

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

我如何设计这个,所以我可以完全从存储库消费者(UnitTest或MVC Web项目)删除实体框架参考 ?我想做的一切都通过我的仓库,没有MVC项目知道任何关于我的ORM技术。

从MVC项目中删除实体框架引用

这有点误导。首先,需要引用实体框架的原因是因为您将代码从该库泄漏到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访问您的服务,该API充当数据访问层的缓冲区,并处理作为匿名JSON对象来回传递的视图模型。然后,你的前端(网站)可以完全与API背后的细节隔离,只是充当它的客户端。Angular JS/Angular(2)非常适合这种方法,我相信很多其他客户端技术也是如此。