我在Visual Studio 2015中使用实体框架6来构建MVVM Light WPF应用程序。我需要将导航属性ICollection绑定到某些CheckBox控件。员工可以有0到最多3个EmployeeStatus实体,其中employeeID作为EmployeeStatus实体上的键; EmployeeStatus又在employeeStatusID的EmployeeStatusDescription表上有一个外键。 EmployeeStatusDescription提供了状态码的描述(如“已存档”,“未激活”,“离开”)。每个EmployeeStatus对应一个EmployeeStatusDescription。更新实体框架导航属性ICollection项目
的employeeStatus在Employee类定义是这样的:
public virtual ICollection<EmployeeStatu> EmployeeStatus { get; set; }
EmployeeStatusDescription在的employeeStatus类定义为:
public virtual EmployeeStatusDescription EmployeeStatusDescription { get; set; }
我想显示3个复选框控件和结合到每个来自EmployeeStatus ICollection值的值。例如,如果员工没有状态“非活动”,并且用户检查该状态,则需要将其添加到EmployeeStatus集合中;如果用户取消选中该项目,我想将其从EmployeeStatus集合中删除。
我已经创建了以下StackPanel来保存复选框;他们一定性质上我的视图模型:
<StackPanel Grid.Row="12"
Grid.Column="1"
Orientation="Vertical">
<StackPanel Orientation="Horizontal">
<TextBlock HorizontalAlignment="Left"
VerticalAlignment="Top"
Text="Inactive" />
<CheckBox IsChecked="{Binding IsSelectedEmployeeInActive}" />
</StackPanel>
<StackPanel Orientation="Horizontal">
<TextBlock HorizontalAlignment="Left"
VerticalAlignment="Top"
Text="Leave of Absence" />
<CheckBox IsChecked="{Binding IsSelectedEmployeeLoa}" />
</StackPanel>
<StackPanel Orientation="Horizontal">
<TextBlock HorizontalAlignment="Left"
VerticalAlignment="Top"
Text="Archived" />
<CheckBox IsChecked="{Binding IsSelectedEmployeeArchived}" />
</StackPanel>
</StackPanel>
下面是绑定到CheckBox控件IsChecked
依赖属性的一个例子属性:
private bool _isSelectedEmployeeInActive;
public bool IsSelectedEmployeeInActive
{
get { return _isSelectedEmployeeInActive; }
set
{
if (_isSelectedEmployeeInActive == value) return;
_isSelectedEmployeeInActive = value;
RaisePropertyChanged(() => IsSelectedEmployeeInActive);
}
}
我做了搜索,获得的实体集合:
var query = (from e in Context.Employees
.Include("EmployeeStatus.EmployeeStatusDescription")
.Where(comparison)
select e);
SearchResults = new ObservableCollection<Employee>(query);
谢谢,@ bme2010。我如何确保我不会为EmployeeStatuses的ICollection添加一个值,该值还不在那里?如果EF值已经存在,EF会炸毁这个'.Add()'吗? – Alex
如果EF违反了外键约束,它只会爆炸。如果你可以有多个具有相同名称的值,它可以让你添加它们。要检查重复项,您可以在ICollection上使用LINQ'.Where(x => x.Name ==“Inactive”)。Count()' – Brandon
再次感谢@ bme2010。在执行'Add()'之前,我会做检查。 – Alex