我正在使用 Entity Framework 6 在 Visual Studio 2015 中构建一个 MVVM WPF 应用程序。该应用程序有一个带有几个复选框的 View :
<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}" />
这些复选框中的每一个都绑定(bind)到一个属性,例如:
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 上的一行时设置。在 View 模型的构造函数中,应用程序有一个事件处理程序,用于更改 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()
行中出现此异常:
{"Store update, insert, or delete statement affected an unexpected number of rows (0). Entities may have been modified or deleted since entities were loaded. See http://go.microsoft.com/fwlink/?LinkId=472540 for information on understanding and handling optimistic concurrency exceptions."}
如果我在 SelectedEmployee
的事件处理程序中注释掉设置复选框属性的代码,错误就会消失;但是我无法将 CheckBox 属性设置为数据库中的初始值。
我该如何解决这个问题?谢谢。
最佳答案
我敢打赌这是因为您在选中复选框时添加了一个新的 EmployeeStatus:
SelectedEmployee.EmployeeStatus.Add(new EmployeeStatu
{
employeeID = SelectedEmployee.employeeID,
validEmployeeStatusID = 2,
exitDate = DateTime.Now,
createdDate = DateTime.Now
});
然后当您取消选中该复选框时,将其状态设置为已删除:
var itemToRemove = SelectedEmployee.EmployeeStatus.Single(x => x.validEmployeeStatusID.Equals(2));
Context.Entry(itemToRemove).State = EntityState.Deleted;
SelectedEmployee.EmployeeStatus.Remove(itemToRemove);
当您调用保存时,数据库无法删除它,因为它从未真正添加到数据库中……它只是添加到上下文中。您将需要检查它是否是新添加的记录。尝试这样的事情,我通常喜欢在发布之前测试代码,但我现在没有时间......
if (Context.Entry(itemToRemove).State != EntityState.Added)
Context.Entry(itemToRemove).State = EntityState.Deleted;
else
Context.Entry(itemToRemove).State = EntityState.Detached;
关于c# - 尝试使用 Entity Framework 保存更改时出现异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36285501/