2016-03-29 10 views
1
私はアプリはいくつかのチェックボックスで表示してい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プロパティが設定されます。ビューモデルのコンストラクタでは、アプリが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(); 
} 

私が変更した場合

{ "ストア更新、挿入、またはDELE:チェックボックスをチェックし、チェックを外し、[保存]をクリックしますとの間に数回を制御し、アプリは上記Context.SaveChanges()ライン上でこの例外に吹きますte文が予想外の行数(0)に影響を与えました。エンティティはロードされた後に変更または削除された可能性があります。 。私は、エラーが表示されなくなり、チェックボックスのプロパティを設定しますSelectedEmployeeのイベントハンドラのコードをコメントアウトした場合}」の理解にとオプティミスティック同時実行の例外を処理

の情報についてhttp://go.microsoft.com/fwlink/?LinkId=472540を参照してください。しかし、私はできませんよ。データベースからの初期値にCheckBoxのプロパティを設定する

どのように私はこの問題を解決する必要があるおかげで

+0

なぜ「デフォルト」ボタンを使ってデータベースからデータを取得しないのですか? –

答えて

3

私はあなたがチェックボックスがチェックされたときに新しいEmployeeStatusを追加しているので、それは賭け:?。

  SelectedEmployee.EmployeeStatus.Add(new EmployeeStatu 
      { 
       employeeID = SelectedEmployee.employeeID, 
       validEmployeeStatusID = 2, 
       exitDate = DateTime.Now, 
       createdDate = DateTime.Now 
      }); 

し、後で削除したにその状態を設定し、チェックボックスのチェックを外したときに:あなたはそれが実際にデータベースに追加されていなかったので、saveを呼び出すとき

 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