2015-08-13 25 views
3

我正在使用EF代碼編寫一個測試應用程序。我在不同的層之間分發了代碼。我以爲我不得不將實體框架包安裝到數據訪問層,但我最終將安裝包(添加dll)到所有層,即UI,BLL,模型,DAL。這沒關係,或者我做錯了什麼。下面的示例代碼給你什麼,我試圖做我們是否應該將實體框架DLL添加到所有層

模型層

這層是在所有其他層參考的想法/項目

namespace Model 
{ 
    Public class Sample 
    { 
     [ForeignKey("Sample2Id")] 
     ... 

    } 
} 

在這一層我使用,因爲數據註解的實體框架的dll像[ForeignKey..

DAL

namespace DAL 
{ 
    public class SampleContext:DbContext 
    { 
     ... 
    } 
} 

在DAL我只有上下文類和遷移

BLL

namespace BLL 
{ 
    public class SampleBLL 
    { 
     public List<Sample> GetAll() 
     { 
      retrn new SampleContext().Samples().ToList() 
     } 
    } 
} 

如果我卸載EF爲BLL我收到以下錯誤 類型System.Data.Entity的。 DbContext在未引用的程序集中定義。

UI

namespace UI 
{ 
    public class UIHelper 
    { 
     public List<Sample> GetSamples() 
     { 
     return new SampleBLL().GetAll(); 
     } 

    } 
} 

如果我卸載從UI的EF包我收到以下錯誤

實體框架提供程序類型 「System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer'在應用程序配置文件 中註冊ADO.NET提供程序與不變名稱'System.Data.SqlClient' 可能n不被加載。確保裝配合格的名稱是用來 和大會是提供給運行的應用程序

+1

您必須在所有圖層(引用它)中安裝EF dll。我不知道爲什麼這是必要的。我希望我們找到能解釋的人。 –

回答

1

我創建了一個示例項目,該項目非常類似當前設置減去模型層/ DAL分離。

我有三個項目,DAL(其中包含對EntityFramework.dllEntityFramework.SqlServer.dll引用),BLL這只是調用在DAL的方法,以及UI這只是調用BLL方法。

我不得不把<configSections>,在<entityFramework>DALapp.config<connectionStrings>部分加入到UI的app.config

當我第一次運行代碼時,我碰到了遇到的同一個錯誤。因此,我查看了我的UI項目的調試文件夾,並注意到EntityFramework.dll已被複制到該文件夾​​中,這是由於其對DGP的依賴關係。我還注意到EntityFramework.SqlServer.dll未被複制到調試文件夾中,儘管DAL也依賴於它。

我將EntityFramework.SqlServer.dll複製到UI項目的調試文件夾中,然後重新運行項目,然後中提琴!我的代碼按預期運行。

它看起來像這裏的問題是,一個DLL不會被複制到UI項目調試文件夾,因爲它是預期的。

相關問題