4

我想通过将它们各自的 DataSources 拖到窗体上来创建一组 DataGridView 控件。我会为一个对象及其导航属性之一(来自数据源)执行此操作,因此在主从关系中有两个网格。

移至 Visual Studio 2012(和 EF 5.0)后,第一个网格按预期出现(使用导航器)。但是,对于“详细”网格,只出现两列(“Count”和“IsReadOnly”)。我已经尝试过使用其他表/对象,但遇到了同样的问题。我试过“编辑列”和“添加列”不可用。我以北风为例。我想要一个表单中的 2 个 datagridview。一个用于客户,另一个用于相关订单。一个典型的主/细节视图。

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

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

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

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

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

和,

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

4

1 回答 1

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,

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

于 2013-01-11T15:30:16.803 回答