我想通过将各自的DataSource拖到窗体上来创建一组DataGridView控件。我会为一个对象和一个导航属性(来自DataSources)做到这一点,因此在Master-Detail关系中有两个网格。
迁移到Visual Studio 2012(和EF 5.0)后,第一个网格按预期(使用导航器)完成。但是,对于“细节”网格,只显示两列(“计数”和“IsReadOnly”)。我已经尝试过与其他表/对象,我遇到了同样的问题。我试过“编辑专栏”& “添加列”无法使用。 我以northwind为例。我想在表单中使用2个datagridview。一个用于客户,另一个用于相关订单。典型的主/细节视图。
我在项目(edmx)文件中添加了一个模型。
为模型添加了新的数据源。两个对象。客户和订单表!
将客户实体拖动为datagridview。所有字段(属性)都在网格中。
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的方式完全相同。但这不是懒惰或急切加载的问题!
答案 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,
您的代码生成文件可能与我的不同,但这些代码部分应该可以让您了解要在文件中搜索的内容。