2016-07-13 26 views
0

メンバーを更新するときに、彼のBankCheckも更新したいと思います。Entity Framework 5:foreignKeyを持つ1対多の更新/追加/削除

これは私のデータベースです:

my database

  • 私bankCheckは、追加、更新、または削除することができます。
  • 私のメンバーは、私は私のデータグリッドの私のメンバーを選択し、[編集]を選択し、私のWPFアプリケーションスイッチ、他のページにし、テキストボックスなどで、私のメンバーを表示するだけで(名前、姓...)

更新することができます

私のボタンをクリックすると、彼の銀行のチェックを追加/編集/削除することができます。最初の銀行チェックを編集することができます。

最後のbankCheckを削除し、他の(たとえば)を追加します。

私は[OK]を押して、 "私の編集を有効にする"をクリックします。

私のプログラムの彼のbankCheckで新しいメンバーを再作成し、私はこの作られた:

private void EditMember(Member updatedMember) 
{ 
    try 
    { 
     using (var context = new KravMagaEntities()) 
     { 
      context.Member.Attach(updatedMember); 
      context.Entry(updatedMember).State = EntityState.Modified; 
      context.SaveChanges(); 
     } 

     ResetAllControls(); 
     States.EnumToText(States.StatesEnum.UpdatingSuccess); 

     Application.Current.Dispatcher.Invoke(() => 
     { 
      _managementService.IsVisibleAddTab(true); 
      _managementService.IsVisibleEditTab(false); 
     }); 
    } 
    catch (Exception exception) 
    { 
     States.EnumToText(States.StatesEnum.Error, exception); 
    } 
} 

をしかし、私はこのエラーを持っている:

A referential integrity constraint violation occurred: The property values that define the referential constraints are not consistent between principal and dependent objects in the relationship.

私はこの問題を解決することができますかわかりませんエラー。

ありがとうございます。

マイコード:私が見るように

private void OnEditMemberBtnClicked(object sender, RoutedEventArgs e) 
{ 
    try 
    { 
     var isValidateCertificat = IsValidDate(BirthDateTxt); 
     var isValidateBirth = IsValidDate(CertificateDateTxt); 
     var isValidateAutorisation = IsValidDate(AutorizationDateTxt); 
     var isValidateReglement = IsValidDate(RuleDateTxt); 

     if (isValidateBirth && isValidateCertificat && isValidateAutorisation && isValidateReglement) 
     { 
      States.EnumToText(States.StatesEnum.Updating); 

      var typePaiement = BankCheckRadio.IsChecked.Value; 
      var typePaiementText = typePaiement ? "Chèque" : "Espèce"; 

      var doctor = ""; 
      var dateCertificate = ""; 

      if (BankCheckRadio.IsChecked.Value) 
      { 
       doctor = DoctorTxt.Text; 
       dateCertificate = CertificateDateTxt.Text; 
      } 

      var editedMember = new Member 
      { 
       id_Member = _idForEdit, 
       name_Member = UppercaseChar(NameTxt.Text), 
       surname_Member = UppercaseChar(SurnameTxt.Text), 
       birthDate_Member = BirthDateTxt.Text, 
       autorizationDate_Member = AutorizationDateTxt.Text, 
       address_Member = UppercaseChar(AddressTxt.Text), 
       postalCode_Member = PostalCodeTxt.Text, 
       country_Member = UppercaseChar(CountryTxt.Text), 
       fixPhone_Member = FixPhoneTxt.Text, 
       mobilePhone_Member = MobilePhoneTxt.Text, 
       mail_Member = MailTxt.Text, 
       beginDate_Member = BeginDateCombo.Text, 
       ruleDate_Member = RuleDateTxt.Text, 
       subscription_Member = SubscriptionCombo.Text, 
       typePaiement_Member = typePaiement, 
       typePaiementText_Member = typePaiementText, 
       federationNumero_Member = FederationNumeroTxt.Text.ToUpper(), 
       level_Member = LevelCombo.Text, 
       certificate_Member = CertificateCheckbox.IsChecked.Value, 
       doctor_Member = UppercaseChar(doctor), 
       certificateDate_Member = dateCertificate, 
       problem_Member = UppercaseChar(ProblemTxt.Text, true), 
       emergencyName_Member = UppercaseChar(EmergencyNameTxt.Text), 
       emergencyPhone_Member = EmergencyPhoneTxt.Text, 
       BankCheck = _bankChecks 
      }; 

      if (_bankChecks != null) 
       { 
        using (var context = new KravMagaEntities()) 
        { 
         foreach (var bankCheck in _bankChecks) 
         { 
          bankCheck.idMember_BankCheck = editedMember.id_Member; 
          context.Entry(bankCheck).State = EntityState.Added; 
         } 
         context.SaveChanges(); 
        } 
       } 

      new Task(() => EditMember(editedMember)).Start(); 
     } 
    } 
    catch (Exception exception) 
    { 
     States.EnumToText(States.StatesEnum.Error, exception); 
    } 
} 

答えて

0

、あなたはすべてのBankAccounts変更されていない、だけMemberを更新しています。両方のエンティティのナビゲーションプロパティを更新していますが、一方のエンティティのみにSaveChanges()を呼び出してください。したがって、Memberは別のBankAccountを参照し始めますが、BankAccountsはまだ古いMemberを参照しています。 BankAccountsを修正して同じ場所に変更したMemberと一緒にマークしてからSaveChanges()に電話をかけて、(コメントから)に保存する必要があります。

重複を追加しないようにするには、エンティティの状態をState.Addedの代わりにState.Modifiedに設定します。

この問題の原因は、エンティティを片側から更新していたためです。 BankAccounts - Membersの関係がある場合、Memberのnavtigationプロパティを更新する場合は、BankAccountのナビゲーションプロパティも更新する必要があります。逆の場合も同様です。あなただけのいくつかのプロパティ(Member.Nameか何か)を更新した場合、あなただけのs「は他のMemberのいずれかに影響を与えることなく、State.ModifiedState」は、このMemberを設定し、BankAccountさんなど

エンティティの追跡は、その後EFあなたのためにオンになっている場合変更されたエンティティを自動的に追跡し、適切な状態を設定します。しかし、私があなたの問題から見てきたように、それはあなたのためにオフになっているので、追加/更新/削除する各オブジェクトの状態を手動で設定する必要があります。

+0

はい私はすでにこれらのリンクを見つけました...そして、それは私がしたことです。 – Naografix

+0

あなたはそこに言及したすべてを試しましたが、それはあなたを助けませんでしたか?あなたの説明から、あなたの問題とこれらのリンクで言及された問題との間に重大な違いはありません。私は完全なコードが表示されないので、あなたは何が違いであるかを調査し、それらの例と同じように動作させることができるかもしれないより多くの情報を持っているかもしれません。 –

+0

また、両方のエンティティを変更したものとしてマークすることを確認します(顧客のナビゲーションプロパティを更新するときに、適切なBankCheckも更新する必要があります)。このリンクを確認してください:http://stackoverflow.com/a/16128818/3731444 –

関連する問題