c# - 尝试使用 Entity Framework 保存更改时出现异常

标签 c# wpf entity-framework checkbox mvvm

我正在使用 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/

相关文章:

c# - google api oauth 访问 token 检索 - 400 错误请求

c# - WPF 数据绑定(bind) ProgressBar 不显示进度

asp.net - 检查 Entity Framework 中 Linq 查询中的空值

c# - 当我在 Entity Framework 中调用 Count 方法时,它是处理所有列还是只处理一个列或什么?

c# - asp.net mvc 2 - 模型绑定(bind)和选择列表

c# - 在模拟函数以返回对象时,表达式树可能不包含使用可选参数的调用或调用

c# - 这种行为叫什么?

c# - 绑定(bind)到祖先的 Datacontext

c# - ObservableCollection<T> 项目更新事件

c# - MVC/EF/LINQ中如何执行存储过程并获取返回结果