WPF DataBinding ForeignKey值未显示

时间:2019-03-09 15:41:04

标签: c# wpf data-binding

我正在尝试在WPF DataGrid中显示前键值。问题是当我加载窗口时,datagrid字段保持为空。但是,当我插入或更新数据时(在单独的窗口中进行操作),并且刷新了数据网格,这些值将正确显示。

这是我绑定它的方式:

<DataGridTextColumn Header="Team" Binding="{Binding Team.TeamName}"/>

DataGrid控件位于EmployeesWindow.xaml中 这是带有外键的表:

 public class Employee
{
    [Key]
    public int EmployeeId { get; set; }
    public string EmployeeName { get; set; }
    //..
    [ForeignKey("Team")]
    public int TeamId { get; set; }
    public Team Team { get; set; }
}

这是被引用的表

public class Team
{
    [Key]
    public int TeamId { get; set; }
    public string TeamName { get; set; }
    public int TeamBonus { get; set; }        
}

EmployeesWindow.xaml中:

public static DataGrid datagrid;
public EmployeesWindow()
    {
        InitializeComponent();
        datagrid = EmployeeDataGrid;
        datagrid.ItemsSource = _db.Employees.ToList();
    }

TeamsWindow.xaml中:

 private void AddEmployee_Click(object sender, RoutedEventArgs e)
    {
        //..
        EmployeesWindow.datagrid.ItemsSource = _db.Employees.ToList();
        this.Hide();
    }

如何在WPF DataGrid数据绑定中显示外键值?

1 个答案:

答案 0 :(得分:1)

我猜这是您正在使用的实体框架,而_db是dbcontext。

默认情况下,EF使用延迟加载相关表。

看看您的linq将产生的SQL。

How do I view the SQL generated by the Entity Framework?

我希望您会发现_db.Employees.ToList();只是给出了“从员工中选择*”之类的内容。

您还需要明确地告诉它以阅读团队。

假设表的名称为Teams,则为:

datagrid.ItemsSource = _db.Employees.Include(“ Teams”)。ToList();

不要只是将其粘贴并按f5键。检查表名是什么以及它将产生什么SQL。

每次使用linq时,都要习惯于检查它产生的sql。使用类似这样的简单内容,您应该立即在原始查询中看不到内部加入Teams。使用更复杂的内容,您可以轻松地发现LINQ产生可怕的sql。

http://www.entityframeworktutorial.net/lazyloading-in-entity-framework.aspx

https://docs.microsoft.com/en-us/ef/ef6/querying/related-data

顺便说一句。

从结构上来说,从数据库中读取整个表并将其直接呈现给UI在许多方面都是不好的。也许这只是原型产品,但是您将使用视图模型,observablecollection,mvvm,tolistasync,并在生产版本中过滤掉200,000名员工。