2016-07-13 11 views
0

Wenn ich mein Mitglied aktualisiere, möchte ich auch seinen BankCheck aktualisieren.Entity Framework 5: Eins zu Viele mit Fremdschlüssel Aktualisiert/Hinzugefügt/Gelöscht

Dies ist meine Datenbank:

my database

  • Meine Zahlungsanweisung hinzugefügt werden kann, aktualisiert oder gelöscht werden.
  • Mein Mitglied nur dann aktualisiert werden (Name, Vorname ...)

ich mein Glied in meinem Datagrid wählen, und wählen Sie Bearbeiten, Schalter meines WPF-Anwendung zu einer anderen Seite und mein Mitglieds Anzeigen mit Textbox etc .

Ich klicke auf meine Schaltfläche, um seinen BankCheck hinzuzufügen/bearbeiten/löschen und ich kann den ersten BankCheck bearbeiten.

Ich lösche die letzte BankCheck und ich füge eine andere (zum Beispiel).

Ich drücke OK und ich klicke auf "Valid my Edit".

Mein Programm neu erstellt ein neues Mitglied mit seiner Zahlungsanweisung und ich mache diese:

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

Aber ich habe diesen Fehler:

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.

Ich weiß nicht, wie ich dieses Problem beheben Error.

Vielen Dank.

Mein Code:

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

Antwort

0

So wie ich sehe, sind Sie nur Member aktualisieren, nicht alle BankAccounts modifiziert. Sie aktualisieren die Navigationseigenschaft von Entitäten von beiden Seiten, rufen jedoch SaveChanges() nur für Entität von einer Seite auf. So beginnt Ihr Member einen anderen BankAccount zu verweisen, während sich Ihr BankAccounts immer noch auf den alten Member bezieht. Sie müssen alle geeigneten BankAccounts wie geändert zusammen mit Ihrer modifizierten Member an der gleichen Stelle markieren und dann SaveChanges() anrufen, so wird alles gespeichert (von Kommentar).

Um das Hinzufügen eines Duplikats zu verhindern, können Sie versuchen, den Status Ihrer Entitäten auf State.Modified anstelle von State.Added festzulegen.

Der Grund für dieses Problem war, dass Sie nur Entität von eine Seite aktualisieren. Wenn Sie eine BankAccounts - Members Beziehung haben, sollten Sie für den Fall, dass Sie die Eigenschaft navtigation für Member aktualisieren, auch eine Navigationseigenschaft für BankAccount aktualisieren und umgekehrt. Wenn Sie aktualisieren nur eine Eigenschaft (Member.Name oder irgendetwas) Sie gerade eingestellt haben diese Member ‚s State-State.Modified ohne andere Member zu beeinflussen‘ s, BankAccount ‚s usw.

Wenn das Unternehmen Tracking für Sie eingeschaltet ist dann EF Verfolgt Entitäten, die geändert wurden, automatisch und legt entsprechende Status für sie fest.Aber wie ich aus Ihrem Problem gesehen habe, ist es für Sie deaktiviert, so dass Sie den Status für jedes Objekt, das Sie hinzufügen/aktualisieren/löschen möchten, manuell festlegen müssen.

+0

Ja, ich habe diese Links schon gefunden ... Und das habe ich gemacht. – Naografix

+0

Also hast du alles versucht, erwähnt dort und es hat dir nicht geholfen? Aus Ihrer Beschreibung ergeben sich keine kritischen Unterschiede zwischen Ihrem Problem und den in diesen Links genannten Problemen. Ich sehe den vollständigen Code nicht. Wenn Sie weitere Informationen haben, können Sie möglicherweise untersuchen, welche Unterschiede bestehen, und versuchen, das gleiche wie in diesen Beispielen zu erreichen. –

+0

Überprüfen Sie auch, ob Sie Entitäten auf beiden Seiten als geändert markieren (wenn Sie eine Navigationseigenschaft für den Kunden aktualisieren, sollten Sie auch einen entsprechenden BankCheck aktualisieren). Überprüfen Sie diesen Link: http://Stackoverflow.com/a/16128818/3731444 –