无法通过将Object DataSource拖动到WinForm来创建Gridview

时间:2012-10-02 18:05:09

标签: entity-framework frameworks entity

我想通过将各自的DataSource拖到窗体上来创建一组DataGridView控件。我会为一个对象和一个导航属性(来自DataSources)做到这一点,因此在Master-Detail关系中有两个网格。

迁移到Visual Studio 2012(和EF 5.0)后,第一个网格按预期(使用导航器)完成。但是,对于“细节”网格,只显示两列(“计数”和“IsReadOnly”)。我已经尝试过与其他表/对象,我遇到了同样的问题。我试过“编辑专栏”& “添加列”无法使用。 我以northwind为例。我想在表单中使用2个datagridview。一个用于客户,另一个用于相关订单。典型的主/细节视图。

  1. 我在项目(edmx)文件中添加了一个模型。

  2. 为模型添加了新的数据源。两个对象。客户和订单表!

  3. 将客户实体拖动为datagridview。所有字段(属性)都在网格中。

  4. 4当从客户实体拖动订单而非订单实体本身时,只有两列名为“count”和“readonly”

    以上程序在linq to sql VS 2012,EF 4.0,.NET 4.5中运行良好。但不适用于EF 5.0。

    这些步骤与http://blogs.msdn.com/b/bethmassi/archive/2008/12/10/master-details-with-entity-framework-explicit-load.aspx中描述的beth massi的方式完全相同。但这不是懒惰或急切加载的问题!

1 个答案:

答案 0 :(得分:1)

在您尝试使用的实体的类中,将导航属性类型更改为ObservableCollection。

由此:

public Customer()
    {
        this.CustomerAddresses = new HashSet<CustomerAddress>();
    }

    public virtual ICollection<CustomerAddress> CustomerAddresses { get; set; }
}

对此:

public Customer()
    {
        this.CustomerAddresses = new ObservableCollection<CustomerAddress>();
    }

    public virtual ICollection<CustomerAddress> CustomerAddresses { get; set; }
}

由于这是自动生成的代码,因此您还需要更改代码生成文件中的某些规则。尝试手动进行这些更改以确保它们先工作然后进行更改。对我来说,我必须对我的.tt文件进行以下更改

使用System.Collections.ObjectModel添加以下提及该行的行。

return inHeader == string.IsNullOrEmpty(_code.VsNamespaceSuggestion())
        ? string.Format(
            CultureInfo.InvariantCulture,
            "{0}using System;{1}" +
            "{2}",
            inHeader ? Environment.NewLine : "",
            includeCollections ? (Environment.NewLine + "using System.Collections.Generic;") : "",
            includeCollections ? (Environment.NewLine + "using System.Collections.ObjectModel;") : "",
            inHeader ? "" : Environment.NewLine)
        : "";

将您的HastSet声明更改为Observable Collection

this.<#=code.Escape(navigationProperty)#> = new ObservableCollection<<#=typeMapper.GetTypeName(navigationProperty.ToEndMember.GetEntityType())#>>();

此外,将ICollection更改为ObservableCollection

navigationProperty.ToEndMember.RelationshipMultiplicity == RelationshipMultiplicity.Many ? ("ICollection<" + endType + ">") : endType,

您的代码生成文件可能与我的不同,但这些代码部分应该可以让您了解要在文件中搜索的内容。