实体框架6:主 - 详细信息视图显示单个HashSet而不是筛选的详细信息项

时间:2017-02-03 22:53:01

标签: c# mysql winforms entity-framework data-binding

我正在尝试基于MySQL数据库支持的实体框架6 DbContext来实现基本的Master-Detail视图。表配置非常简单:

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

我的测试应用程序的形式包含两个ComboBox元素 - 一个用于主类别,一个用于子类别(在我的情况下,master是电子组件的类型,例如" IC&#34 ;细节更具体,如" FPGA","微控制器"等。)

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

每个DataSource的{​​{1}}属性都通过表单设计器设置为自己的ComboBox

绑定源本身以不同的方式设置BindingSource属性,遵循我发现的各种教程:

  • Master BindingSource:通过DataSource
  • 设置为代表DbSet表的comp_main_type
  • 详细信息BindingSource:设置为主绑定源,BindingList属性设置为"导航属性"从大师到细节
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"; ,但未详细填充ComboBoxComboBox的类型名称不是显示单个项目,而是显示为唯一项目:

HashSet

调试器显示此System.Collections.Generic.HashSet`1[ExampleApp.comp_sub_type] 确实包含由所选主项目筛选的正确项目:

Debugger showing the items of the ComboBox items list

我无法找到导致这种情况的原因 - 为什么详细信息HashSet不会填充ComboBox的项目,而是HashSet本身?< / p>

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.edmx文件下的ProductModel.tt文件

     

双击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

应用这些更改后,详细信息视图将按预期工作。