2017-02-03 26 views
1

我試圖基於實體框架6 DbContext基於MySQL數據庫實現基本的主 - 細節視圖。該表結構簡單,因爲它可以得到:實體框架6:主 - 細節視圖顯示單個HashSet而不是過濾的細節項目

ER Diagram showing one-to-many relationship between two simple tables

我的測試應用程序的形式包含兩個ComboBox元素 - 一個用於主類別,一個用於一個子類別(在我的情況下,主站是該類型例如「IC」,細節更具體,如「FPGA」,「微控制器」等)。

Two Comboboxes ("MainType" and "SubType"), with the lower one showing a class name instead of a list of items

每個ComboBoxDataSource屬性通過窗體設計器設置爲自己的BindingSource

的結合源本身有自己的DataSource性質以不同的方式設置,秉承各種教程,我發現:

  • 大師的BindingSource:設置爲通過BindingList
  • 代表comp_main_typeDbSet詳細信息BindingSource:設置爲主綁定源,將DataMember屬性設置爲從主設備到詳細設備的「導航屬性」
ExampleEntities entities = new ExampleEntities(); 
entities.comp_main_type.Load(); 
entities.comp_sub_type.Load(); 

BindingSourceCompMainType.DataSource = entities.comp_main_type.Local.ToBindingList(); 

BindingSourceCompSubType.DataSource = BindingSourceCompMainType; 
BindingSourceCompSubType.DataMember = "comp_sub_type"; 

這部分工作正常 - 主ComboBox正確填充,但細節ComboBox不是。代替示出的個別項目的,一個HashSet的種類名稱顯示爲唯一的項目:

System.Collections.Generic.HashSet`1[ExampleApp.comp_sub_type] 

調試器顯示該HashSet確實包含由所選擇的主項目過濾正確的項目:

Debugger showing the items of the ComboBox items list

我無法找到造成這種情況的原因 - 爲什麼ComboBox中沒有填充HashSet的項目,而是HashSet本身?

+1

看看[WinForms實體框架數據綁定](https://msdn.microsoft.com/en-us/library/jj682076(v = vs.113).aspx)。本逐步演練演示瞭如何將POCO類型綁定到「主控 - 詳細」窗體中的窗體窗體(WinForms)控件。應用程序使用實體框架使用數據庫中的數據填充對象,跟蹤更改並將數據保存到數據庫 –

+1

謝謝,第二次檢查了指南,並根據我的回答進行了一些更改,現在它可以工作了! –

+0

不客氣:) –

回答

1

經過檢查鏈接Reza Aghaei提供,問題的原因變得非常明顯:不知何故,我跳過了指南的重要部分。

這是需要添加下面的類:

using System.Collections; 
using System.Collections.Generic; 
using System.Collections.ObjectModel; 
using System.ComponentModel; 
using System.Diagnostics.CodeAnalysis; 
using System.Data.Entity; 

namespace WinFormswithEFSample 
{ 
    public class ObservableListSource<T> : ObservableCollection<T>,  IListSource 
      where T : class 
    { 
     private IBindingList _bindingList; 

     bool IListSource.ContainsListCollection { get { return false; } } 

     IList IListSource.GetList() 
     { 
      return _bindingList ?? (_bindingList = this.ToBindingList()); 
     } 
    } 
} 

之後,代碼生成模板必須進行修改:

查找,這將在產品型號的下一層的ProductModel.tt文件。 edmx文件

雙擊ProductModel。tt文件在Visual Studio編輯器中打開它

查找並用「ObservableListSource」替換兩個「ICollection」。這些位於大約第296和第484行。

使用「ObservableListSource」查找並替換第一次出現的「HashSet」。這種情況大約在第50行。不要替換稍後在代碼中找到的第二次出現的HashSet。

保存ProductModel.tt文件。這應該導致實體的代碼被重新生成。如果代碼不自動重新生成,請右鍵單擊ProductModel.tt並選擇「運行自定義工具」。

來源:https://msdn.microsoft.com/en-us/library/jj682076(v=vs.113).aspx

應用這些更改後,詳細視圖按預期工作。