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; 
}