Как напрямую обрабатывать отношения M: M с использованием DataGrids и Entity Framework - PullRequest
0 голосов
/ 06 февраля 2019

Использование базы данных Первый подход с EF6, в настоящее время у меня есть 2 сущности в отношении M: N (пользователи и роли), которые я хотел бы установить на одной странице WPF.Моя цель состоит в том, чтобы иметь 2 сетки данных в отношении «мастер-детализация», которые поддерживают встроенное редактирование - верхняя часть отображает всех пользователей, а нижняя - роли выбранного пользователя.Я успешно реализовал пользовательскую сетку данных с помощью встроенного редактирования, но при редактировании записей во второй сетке данных она напрямую изменяет таблицу ролей, а не отношение.

Окно XAML:

                    <DataGrid Name="DataGridUsers"  AutoGenerateColumns="False"  IsTextSearchEnabled="True" SelectionChanged="DataGridUsers_SelectionChanged" Margin="15" MaxHeight="300" CellEditEnding="DataGridUsers_CellEditEnding">
                        <DataGrid.Columns>
                            <DataGridTextColumn Binding="{Binding Username, Mode=TwoWay}" Header="Username"/>
                            <DataGridTextColumn Binding="{Binding FirstName, Mode=TwoWay}" Header="First Name" />
                            <DataGridTextColumn Binding="{Binding LastName, Mode=TwoWay}" Header="Last Name"/>
                            <DataGridTextColumn Binding="{Binding email, Mode=TwoWay}" Header="Email"/>
                        </DataGrid.Columns>
                    </DataGrid>


                <DataGrid Name="DataGridUserRoles"  AutoGenerateColumns="False" Margin="15" CellEditEnding="DataGridUserRoles_CellEditEnding" >
                    <DataGrid.Columns>
                        <DataGridTextColumn Binding="{Binding RoleName, Mode=TwoWay}" Header="Role Name" />
                    </DataGrid.Columns>
                </DataGrid>

Я использую следующие 2 строки для установки источника элементов для сетки данных пользователей при загрузке окна:

context.Users.Include(a => a.Roles).Load();
DataGridUsers.ItemsSource = context.Users.Local;

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

var CurrentUser = DataGridUsers.SelectedItem as User;
DataGridUserRoles.ItemsSource = context.Roles.Local.Where(x => x.Users.Any(y => y.UserID == CurrentUser.UserID)).ToList();

Это правильно заполняет значения в таблице данных Roles на основе записей в таблице UsersRoles.

Все мои сохранения обрабатываются общей кнопкой сохранения в форме, которая сохраняет всеконтекст асинхронно.

    private async void SaveAll()
    {
        await (context.SaveChangesAsync());
    }

Когда я редактирую сетку данных ролей, я непосредственно манипулирую данными в моей таблице ролей, а не в таблице соединений UsersRoles.Моя цель состоит в том, чтобы нижняя таблица напрямую обновляла таблицу UsersRoles, чтобы разрешениями пользователя можно было управлять через приложение.Как настроить привязку для сетки данных ролей, чтобы добиться этого?

...