6

我剛剛創建了一個用戶控件。 此控件還使用我的靜態實體框架類來加載兩個組合框。 一切都很好,運行沒有問題。設計和運行時正在工作。 然後當我停止應用程序時,包含我的UserControl的所有表單在設計時不再工作。我只看到兩個錯誤:UserControl中的EF無法看到app.config?

錯誤1: 在配置中找不到指定的命名連接,不打算與EntityClient提供程序一起使用,或者無效。

錯誤2: 變量ccArtikelVelden要麼是未聲明的,要麼是從未分配的。 (ccArtikelVelde是我UserControl

運行一切仍在工作

我的靜態EF Repositoy類:

public class BSManagerData 
{ 
    private static BSManagerEntities _entities; 
    public static BSManagerEntities Entities 
    { 
     get 
     { 
      if (_entities == null) 
       _entities = new BSManagerEntities(); 
      return _entities; 
     } 
     set 
     { 
      _entities = value; 
     } 
    } 
} 

一些邏輯,我的用戶發生加載在組合框的數據:

private void LaadCbx() 
{ 
    cbxCategorie.DataSource = (from c in BSManagerData.Entities.Categories 
           select c).ToList(); 
    cbxCategorie.DisplayMember = "Naam"; 
    cbxCategorie.ValueMember = "Id"; 
} 

private void cbxCategorie_SelectedIndexChanged(object sender, EventArgs e) 
{ 
    cbxFabrikant.DataSource = from f in BSManagerData.Entities.Fabrikants 
           where f.Categorie.Id == ((Categorie)cbxCategorie.SelectedItem).Id 
           select f; 
    cbxFabrikant.DisplayMember = "Naam"; 
    cbxFabrikant.ValueMember = "Id"; 
} 

讓我的表單再次工作的唯一方法就是在UserControl中註釋EF部分(設計時間)見上)和重建。 這很奇怪,一切都在同一個程序集,相同的命名空間(爲了簡單起見)。

任何想法?

+2

我一讀完單詞「靜態實體框架類」就停止閱讀。別那樣做。現在。 ObjectContext並不是用來這樣使用的。 – Aaronaught

回答

8

看起來你在設計模式下以某種方式執行數據庫代碼。爲了防止這種情況,追捕控制和方法造成這一點,並使用:

if (DesignMode) 
    return 

而且,這是一個非常糟糕的主意,靜態緩存數據庫上下文。這會導致多線程問題,以及插入和刪除時的問題。數據庫上下文旨在用於單個「工作單元」,添加2和刪除3個其他對象,並調用SaveChanges一次。

+0

謝謝你的回覆 我都是最佳實踐,如果使用靜態類是不好的做法,我必須看到我應該如何做另一種方式。問題是前段時間我遇到了一個錯誤,我無法從另一個上下文中編輯對象。我在StackOverflow上讀到,創建一個靜態類是解決方案之一。這就是爲什麼我採用這種方法。當我需要訪問數據庫時,我也不是每一次的忠實粉絲,都圍繞我的操作構建使用聲明。我是EF新手,所以任何建設性的建議都更受歡迎! – Sven

+0

剛剛嘗試過你的建議,但仍然不好。現在我做了以下操作: private void LaadCbx() { if(DesignMode) return; cbxCategorie.DataSource =(來自BSManagerData.Entities.Categories中的c select c).ToList(); cbxCategorie.DisplayMember =「Naam」; cbxCategorie.ValueMember =「Id」; } 但是,當我嘗試將控件添加到我的窗體時,出現以下錯誤:http://img716.imageshack.us/img716/6549/eferror.png – Sven

+0

從哪裏調用LaadCbx()?如果你從構造函數調用它,嘗試從控件的構造函數中刪除它。在構造函數中儘可能少地做(尤其是不是這個問題,但總的來說),尤其是不要DB連接。你應該可以使用像OnLoad這樣的鉤子來加載數據。 –

2

我面臨同樣的問題,

就我而言,我已經添加其使用的一些庫,這不加載,直到運行在用戶控件加載事件一些數據庫代碼。

因此建議不要在用戶控件加載事件中編寫任何數據庫代碼。

希望,這可以幫助你!

+0

謝謝,男人! 我剛剛花了3個小時,試圖理解,我做錯了什麼。 我試圖重新創建實體模型,創建了一些測試解決方案......並且答案很簡單: 不要在用戶控制負載事件中寫入數據庫代碼! –

0

如果在userControl的構造函數上調用函數「LaadCbx()」,則會顯示此錯誤。

因爲實體框架的初始化存在這個函數中。

解決方法是在父窗體的構造函數中調用此函數「LaadCbx()」。