【问题标题】:Exception when trying to SaveChanges with Entity Framework尝试使用实体框架保存更改时出现异常
【发布时间】: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


【解决方案1】:

我敢打赌,这是因为您在选中复选框时添加了一个新的 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);

当您调用 save 时,数据库无法删除它,因为它从未真正添加到数据库中......它只是添加到上下文中。您需要检查它是否是新添加的记录。试试这样的东西,我通常喜欢在发布之前测试代码,但我现在没有时间......

if (Context.Entry(itemToRemove).State != EntityState.Added)
   Context.Entry(itemToRemove).State = EntityState.Deleted;
else
   Context.Entry(itemToRemove).State = EntityState.Detached;

【讨论】:

  • 谢谢,@J.H.我没有保存更改,实体进入了不一致的状态——在彼此之上进行添加和删除。这解决了问题!
猜你喜欢
  • 2013-01-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-27
  • 1970-01-01
  • 2014-06-07
  • 1970-01-01
相关资源
最近更新 更多