2016-03-28 147 views
0

我在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); 

回答

1

在你的属性里面,我也会添加/从集合中删除。如果您还没有将选定的员工存储在某个地方,以便您可以访问它。

  if (_isSelectedEmployeeInActive == value) return; 

      _isSelectedEmployeeInActive = value; 

      //do updates to collection here 
      if (value) 
      { 
       SelectedEmployee.EmployeeStatus.Add(new EmployeeStatus("Inactive")); 
      } 
      else 
      { 
       SelectedEmployee.EmployeeStatus.Remove("Inactive")); 
      } 

      RaisePropertyChanged(() => IsSelectedEmployeeInActive); 

我不确定你的员工状态如何,但你明白了。 只需确保完成检查在上下文中调用SaveChanges的方框,以便将更改保存到数据库。

+0

谢谢,@ bme2010。我如何确保我不会为EmployeeStatuses的ICollection添加一个值,该值还不在那里?如果EF值已经存在,EF会炸毁这个'.Add()'吗? – Alex

+1

如果EF违反了外键约束,它只会爆炸。如果你可以有多个具有相同名称的值,它可以让你添加它们。要检查重复项,您可以在ICollection上使用LINQ'.Where(x => x.Name ==“Inactive”)。Count()' – Brandon

+0

再次感谢@ bme2010。在执行'Add()'之前,我会做检查。 – Alex