使用EF6的数据库优先方法,我目前希望在一个WPF页面中建立两个M:N关系的实体(用户和角色)。我的目标是在主从关系中有2个数据网格,它们支持嵌入式编辑-顶部将显示所有用户,底部将显示所选用户的角色。我已经通过内联编辑成功地实现了用户数据网格,但是,在第二个数据网格上编辑记录时,它直接更改了Roles表,而不是关系。
Window 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行设置窗口加载时Users Datagrid的ItemsSource:
context.Users.Include(a => a.Roles).Load();
DataGridUsers.ItemsSource = context.Users.Local;
当在Users Datagrid上所做的选择更改时,我使用以下内容来设置Roles Data Grid ItemsSource。
var CurrentUser = DataGridUsers.SelectedItem as User;
DataGridUserRoles.ItemsSource = context.Roles.Local.Where(x => x.Users.Any(y => y.UserID == CurrentUser.UserID)).ToList();
这会根据UsersRoles表中的条目将值正确填充到Roles数据网格中。
我所有的保存都由表单上的通用保存按钮处理,该按钮异步保存整个上下文。
private async void SaveAll()
{
await (context.SaveChangesAsync());
}
编辑“角色数据”网格时,我直接在“角色”表中而不是在UsersRoles联结表中操纵数据。我的目标是让最下面的表直接更新UsersRoles表,以便可以通过应用程序管理用户权限。如何调整Roles数据网格的绑定以实现此目的?