2015-03-19 96 views
2

在試圖實踐問題分離時,我正在採用ASP.NET MVC項目,並將模型和DBContext放入同一解決方案中的單獨項目中。現在我有一個包含ViewModels,控制器和視圖的Project.Web,並且我爲Models和DAL提供了Projects.Entities。具有ConnectionString屬性的web.config文件位於Project.Web項目中。從同一解決方案中的不同項目訪問EF ConnectionString MVC

Project.Web

<connectionStrings> 
    <add name="SchoolContext" connectionString="Data Source=localhost;Initial Catalog=ContosoUniversity1;Integrated Security=True" providerName="System.Data.SqlClient" /> 
    </connectionStrings> 

首頁控制器:

public class HomeController : Controller 
{ 
    private SchoolContext db = new SchoolContext(); 

Project.Entities

public class SchoolContext : DbContext 
{ 
    public SchoolContext() : base("SchoolContext") 
    { 

    } 

我的問題是,SchoolContext的connectionString名沒有得到由回升DBContext,因爲它在另一個項目的web.config中。我如何緩解這一點?當所有MVC組件都在同一個項目中時,一切正常。

+0

使用的DbContext構造與連接字符串參數。然後你可以通過這個你的網站項目和你的DAL不需要保留一個重複的值 – Jasen 2015-03-19 01:20:41

+0

我想這就是我想要做的事情,但是不太確定在哪裏實施,你能給我一個快速的例子嗎?我試過但無法工作的公共部分類MyEFEntities { public MyEFEntities(string connectionstring) :base(connectionstring) { } }' – Reza 2015-03-19 01:27:34

回答

0

我在最初的問題的代碼工作就像即使有DAL分裂成不同的項目的魅力。問題是EF Code First Initializer沒有得到執行,這是因爲當我將初始化程序代碼移動到它自己的項目時,我沒有在web.config文件中使用正確的程序集。修改後的web.config文件應該是這樣的(我錯過了.Entities在DAL是在一個叫做ContosoUniversity.Entities項目。

<entityFramework> 
    <contexts> 
     <context type="ContosoUniversity.DAL.SchoolContext, ContosoUniversity.Entities"> 
     <databaseInitializer type="ContosoUniversity.DAL.SchoolInitializer, ContosoUniversity.Entities" /> 
     </context> 
    </contexts> 
1

這基本上是我如何設置我的解決方案。我可以讓web項目web.config或測試項目app.config定義連接字符串。

數據項目

public class SchoolContext : DbContext 
{ 
    public SchoolContext(string connectionString) 
     : base(connectionString) { } 
} 

Web項目

的web.config

<configuration> 
    <connectionStrings> 
     <add name="SchoolContextDb" connectionString="Data Source=..." /> 
    </connectionStrings> 
    <appSettings> 
     <add key="SchoolContext" value="SchoolContextDb" /> 
    </appSettings> 
    ... 
</configuration> 

使用

string ConnectionString = System.Configuration.ConfigurationManager.AppSettings["SchoolContext"]; 

SchoolContext db = new SchoolContext("Name=" + ConnectionString); 

我使用DI容器,所以我只在應用程序啓動代碼中真正查找連接字符串一次。但是,您可以使全局變量爲ConnectionString,或者在基本控制器中設置。

0

默認情況下,入口點解決方案檢查web.config與connectionstring,它會檢查參考項目。

  1. 與此代碼片斷,它沒有得到更多的細節,你會得到任何錯誤。
  2. 你可以驗證你是否改變了dbcontext名稱你得到了什麼錯誤。默認情況下,如果它沒有設置,那麼它採用類名稱定義與dbcontext類。
  3. 驗證 ...
  4. 我希望你在配置文件中已經設置的設置。 驗證上下文和命名空間

<entityFramework> 
 
<contexts> 
 
     <context type="ContosoUniversity.DAL.SchoolContext, ContosoUniversity.DAL"> 
 
     <databaseInitializer type="ContosoUniversity.DAL.SchoolInitializer, ContosoUniversity.DAL" /> 
 
     </context> 
 
</contexts> 
 
</entityFramework>

+0

我試圖拼湊你所問的原因,它不是很清楚1)是的,我收到了上述代碼的錯誤消息。 '不能從程序集'ContosoUniversity'中加載類型'ContosoUniversity.DAL.SchoolContext'。'2)我將ConnectionString的名字改爲了不同的東西,並得到與1相同的錯誤4)是的,清楚地表明在配置文件中有一個connectionString文件。如果我把DAL和Models文件夾放在我的WebUI項目中,一切正常, – Reza 2015-03-19 03:00:25

+0

已更新我的回覆....似乎與程序集中的上下文提到配置中不匹配。如果這不起作用,那麼你需要提供你的配置文件。 – niku 2015-03-19 21:12:59

+0

我從你的代碼片段中嘗試了'databaseinitializer'的上述代碼,但仍然有問題。然而,我只是註釋掉了初始化器,解決方案運行良好,數據也顯示出來了。所以至少我知道它不是無法獲得連接字符串的問題。然而,我不明白爲什麼SchoolInitializer類不執行,它在ContosoUniversity.DAL命名空間的Project.Entities項目中。 – Reza 2015-03-20 03:22:22

相關問題