4

道歉,这已经回答了,但2小时后,研究我还没有找到一个明确的答案这个问题。希望问会产生结果。去除MVC项目实体框架参考如果

我与MVC和EF“一定程度上比初学者更好”,但我不明白的整体应用架构。你看,为了更大的分离关注和未来计划的变更,我想与我的MVC项目从实体框架分离。这是我到目前为止有:

  • 模型项目(全注释良好波苏斯,集装箱,没有业务逻辑的)
  • 数据访问项目(参考我的模型的项目,和Entity Framework)
  • MVC的Web项目(仅参考我的Models项目)

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

问题是,消费者(在这种情况下为UnitTest项目)仍然需要实体框架(与MVC Web项目相同)的nuget 参考。当我(通过它的时候到我的数据访问项目,而不是硬编码我的连接字符串)请从我的测试项目中的EF参考,我得到这个错误:

No Entity Framework provider found for the ADO.NET provider with invariant name 'System.Data.SqlClient'. Make sure the provider is registered in the 'entityFramework' section of the application config file.

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

回答

3

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

+0

有趣。所以你可以进一步扩大。我怎么能完全避免参考?而当我准备好脱离EF并使用不同的ORM时,是否唯一一次能够从MVC项目中删除EF引用? –

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

这就是我想要避免的。 –

0

你可以尝试通过Web API,它充当缓冲器的数据访问层(S)和优惠来回传递匿名JSON对象视图模型访问您的服务。然后,您的前端(网站)可以与API背后的细节完全隔离,并充当客户端。 Angular JS/Angular(2)很适合这种方法,因为我相信很多其他客户端技术都可以。

+0

确实如此。但是,然后我们失去了强大的打字和可维护性。 –

+0

是的,但现在有办法解决这个问题,就像使用带有自动更新的声明文件的TypeScript来关闭循环一样。 –

1

问题是Visual Studio剥离了所有未在项目中使用的引用。这解决了我的问题:

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