【发布时间】:2022-03-01 23:52:14
【问题描述】:
我有 2 个 SQL 表,我通过 SQL Server Managment Studio(包括 PK 和 FK)创建:
在 Visual Studio 的 WinForm 项目中,我通过 Code First 将数据模型添加到现有数据库,并通过以下 linq-query 读取数据:
dataGridView1.DataSource = dbContext.deliveries.OrderBy(d => d.id).ToList();
现在 datagridView1 由“deliveries”表中的列组成,但我不想显示列 customer_id 我想显示相应的客户名称和地址。
stackoverflow 上的其他一些答案建议编辑查询并使用“包含”属性。所以我尝试使用
deliveries.Include(d=>d.customer.name).OrderBy(d => d.id).ToList();
但这会在运行时引发异常,并出现以下错误:
The EntityType '*.customer' does not declare a navigation property with the name 'name'
我不明白,因为我的类遵循https://docs.microsoft.com/en-us/ef/ef6/fundamentals/relationships 的形式并且是通过现有数据库中的代码优先创建的。
public partial class deliveries
{
public int id { get; set; }
public int? amount { get; set; }
public int? customer_id { get; set; }
[ForeignKey("customer_id")]
public virtual customer customer { get; set; }
}
public partial class customer
{
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2214:DoNotCallOverridableMethodsInConstructors")]
public customer()
{
deliveries = new HashSet<deliveries>();
}
[Key]
public int customerID { get; set; }
[StringLength(50)]
public string name { get; set; }
[StringLength(10)]
public string address { get; set; }
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")]
public virtual ICollection<deliveries> deliveries { get; set; }
}
【问题讨论】:
-
添加您的课程
Deleivery、Customer。显示您的映射。 -
添加了上面的类。不确定映射是什么意思?
-
我在这篇文章中分享了一些解决方案:Show Properties of a Navigation Property in DataGridView (Second Level Properties),包括:使用 DataGridViewComboBoxColumn,向实体添加属性,塑造 Linq 查询的结果,使用 CellFormatting,覆盖实体的 ToString,使用自定义类型描述符。它还为每个案例提供了一个示例和使用场景。
-
@RezaAghaei 是否支持嵌套的 displaymemberpath?
-
@RezaAghaei 谢谢,你的链接很好读。但我需要的只是下面接受的答案中提到的“选择”命令。
标签: c# winforms linq datagridview