Значение ForeignKey WPF DataBinding не отображается - PullRequest
0 голосов
/ 09 марта 2019

Я пытаюсь отобразить значения ключевых слов в WPF 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 Ответ

1 голос
/ 09 марта 2019

Полагаю, это используемая вами структура сущностей, а _db - это dbcontext.

EF по умолчанию использует отложенную загрузку связанных таблиц.

Посмотрите на sql, который создаст ваш linq.

Как просмотреть SQL, сгенерированный Entity Framework?

Полагаю, вы найдете, что _db.Employees.ToList (); просто дает что-то вроде «выбрать * из сотрудников».

Вы должны явно указать это, чтобы читать Команды также.

Предполагается, что именем таблицы будет «Команды»:

datagrid.ItemsSource = _db.Employees.Include ("Команды"). ToList ();

Не просто вставьте это и нажмите f5. Проверьте, как называется ваша таблица и какой sql она выдаст.

Каждый раз, когда вы используете linq, привыкните к проверке создаваемого sql. С такими простыми вещами вы сразу же не увидите внутреннего соединения с командами в исходном запросе. С более сложными вещами вы можете легко найти LINQ производит ужасный sql.

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

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

В сторону.

Архитектурно, чтение всей таблицы из базы данных и представление непосредственно в пользовательском интерфейсе плохо по нескольким причинам. Возможно, это всего лишь прототип, и вы собираетесь использовать viewmodel, observablecollection, mvvm, tolistasync и фильтровать 200 000 своих сотрудников в рабочей версии.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...