【发布时间】:2016-07-17 01:54:23
【问题描述】:
我正在使用 Entity Framework 6 在 Visual Studio 2015 中构建一个 MVVM WPF 应用程序。该应用程序有一个带有几个复选框的视图:
<TextBlock Grid.Row="0"
Grid.Column="0"
Style="{StaticResource FieldLabel}"
Text="Inactive" />
<CheckBox Grid.Row="0"
Grid.Column="1"
IsChecked="{Binding IsSelectedEmployeeInActive,
Mode=TwoWay}" />
<TextBlock Grid.Row="1"
Grid.Column="0"
Style="{StaticResource FieldLabel}"
Text="Leave of Absence" />
<CheckBox Grid.Row="1"
Grid.Column="1"
IsChecked="{Binding IsSelectedEmployeeLoa,
Mode=TwoWay}" />
<TextBlock Grid.Row="2"
Grid.Column="0"
Style="{StaticResource FieldLabel}"
Text="Archived" />
<CheckBox Grid.Row="2"
Grid.Column="1"
IsChecked="{Binding IsSelectedEmployeeArchived,
Mode=TwoWay}" />
每个复选框都绑定到一个属性,例如:
public bool IsSelectedEmployeeInActive
{
get { return _isSelectedEmployeeInActive; }
set
{
if (_isSelectedEmployeeInActive == value) return;
_isSelectedEmployeeInActive = value;
if (value)
{
var count = SelectedEmployee.EmployeeStatus.Count(x => x.validEmployeeStatusID.Equals(2));
if (count.Equals(0))
{
SelectedEmployee.EmployeeStatus.Add(new EmployeeStatu
{
employeeID = SelectedEmployee.employeeID,
validEmployeeStatusID = 2,
exitDate = DateTime.Now,
createdDate = DateTime.Now
});
}
}
else
{
var itemToRemove = SelectedEmployee.EmployeeStatus.Single(x => x.validEmployeeStatusID.Equals(2));
Context.Entry(itemToRemove).State = EntityState.Deleted;
SelectedEmployee.EmployeeStatus.Remove(itemToRemove);
}
RaisePropertyChanged(() => IsSelectedEmployeeInActive);
}
}
SelectedEmployee 属性在用户单击 DataGrid 上的一行时设置。在视图模型的构造函数中,应用程序有一个用于更改 SelectedEmployee 的事件处理程序:
this.PropertyChanged += (o, e) =>
{
if (e.PropertyName == nameof(this.SelectedEmployee))
{
IsSelectedEmployeeLoa = (SelectedEmployee.EmployeeStatus
.Count(x => x.validEmployeeStatusID.Equals(2)) > 0);
IsSelectedEmployeeArchived = (SelectedEmployee.EmployeeStatus
.Count(x => x.validEmployeeStatusID.Equals(5)) > 0);
IsSelectedEmployeeInActive = (SelectedEmployee.EmployeeStatus
.Count(x => x.validEmployeeStatusID.Equals(4)) > 0);
}
};
当用户点击保存按钮时,它会通过 RelayCommand 调用以下命令:
public void SaveEmployees()
{
Context.SaveChanges();
}
如果我在选中和未选中之间更改 CheckBox 控件几次并单击保存,则应用程序会在上面的 Context.SaveChanges() 行出现此异常:
{“存储更新、插入或删除语句影响了意外数量的行 (0)。实体可能在加载实体后已被修改或删除。有关理解和处理乐观并发异常的信息,请参阅 http://go.microsoft.com/fwlink/?LinkId=472540。” }
如果我在SelectedEmployee 的事件处理程序中注释掉设置复选框属性的代码,错误就会消失;但后来我无法将 CheckBox 属性设置为数据库中的初始值。
我应该如何解决这个问题?谢谢。
【问题讨论】:
-
为什么不使用“默认”按钮从数据库中检索数据?
标签: c# wpf entity-framework checkbox mvvm