如果已经回答道歉,但经过2个小时的研究后,我还没有找到这个问题的明确答案。希望询问会产生结果。
对于MVC和EF,我“比初学者好”,但我确实理解整体应用程序架构。您可以看到,对于更大的关注点分离和未来计划的更改,我希望将我的MVC项目与实体框架分离。这是我到目前为止所做的:
我已经创建了我的Repository模式(在DataAccess项目中),并使用单独的UnitTest项目对其进行了测试。一切正常。
问题是,消费者(在这种情况下为UnitTest项目)仍然需要nuget 引用到Entity Framework(与MVC Web项目相同)。当我从我的测试项目中删除EF引用时(而是在将其传递到我的DataAccess项目时硬编码我的连接字符串)时,我收到此错误:
找不到ADO.NET提供程序的实体框架提供程序 不变名称'System.Data.SqlClient'。确保提供商是 在应用程序配置的'entityFramework'部分注册 文件。
我如何设计这个,以便我可以从Repository使用者(UnitTest或MVC Web项目)中完全删除实体框架参考?我希望通过我的存储库完成所有工作,而MVC项目却不了解我的ORM技术。
答案 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)非常适合这种方法,因为我相信很多其他客户端技术都可以。