2016-03-29 5 views
1

Я строю приложение MVVM WPF в Visual Studio 2015 с использованием Entity Framework 6. Приложение имеет вид с несколькими флажком:Исключение при попытке SaveChanges с Entity Framework

<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(); 
} 

Если изменить флажок для управления несколько раз между проверяемым и непроверяемой и нажмите кнопку Сохранить, приложение взрывает с этим исключением на Context.SaveChanges() линиях выше:

{ "обновление магазина, вставки или дель ete повлияло на неожиданное количество строк (0). Объекты могут быть изменены или удалены, поскольку объекты загружены. См http://go.microsoft.com/fwlink/?LinkId=472540 для получения информации о понимании и обработки оптимистических исключений параллелизма "}

Если я закомментировать код в обработчик событий для SelectedEmployee, который устанавливает свойства флажка, то ошибка уходит,., Но тогда я не могу .?., чтобы установить свойства CheckBox в их начальные значения из базы данных

Как я должен решить этот вопрос Спасибо

+0

Почему бы вам не использовать кнопку «По умолчанию», чтобы извлечь данные из базы данных? –

ответ

3

Держу пари, это потому, что вы добавляете новый 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; 
+0

Спасибо, @ J.H. Я не сохранял изменения, и сущности попадали в несогласованное состояние - делали добавление и удаление друг на друга. Это устранило проблему! – Alex

Смежные вопросы