2016-07-13 1 views
0

Lorsque je mets à jour mon membre, je veux aussi mettre à jour son BankCheck.Entity Framework 5: Un à plusieurs avec foreignKey Mis à jour/Ajouté/Supprimé

C'est ma base de données:

my database

  • Mon bankCheck peut être ajouté, mis à jour ou supprimé.
  • Mon membre peut être mis à jour que (nom, prénom ...)

Je choisis mon membre dans mon DataGrid et sélectionnez Modifier, mon WPF commutateur d'application à une autre page, et afficher mon membre avec Textbox etc Je clique sur mon bouton pour ajouter/modifier/supprimer son bankCheck et je peux éditer le premier bankCheck.

Je supprime le dernier bankCheck et j'en ajoute un autre (par exemple).

J'appuie sur OK et je clique sur "Valid my Edit".

Mon programme re-crée un nouveau membre avec son bankCheck et je fait ceci:

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

Mais je cette erreur:

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.

Je ne sais pas comment je peux résoudre ce problème Erreur.

Merci.

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

Répondre

0

Alors que je vois, vous êtes mise à jour ne Member, pas tous modifié BankAccounts. Vous mettez à jour la propriété de navigation des entités des deux côtés, mais en appelant SaveChanges() uniquement sur l'entité d'un côté. Donc, votre Member commence à se référer à un autre BankAccount tandis que votre BankAccounts fait toujours référence à l'ancien Member. Vous devez marquer tous les BankAccounts modifiés comme modifiés avec votre Member modifié dans le même endroit, puis appelez SaveChanges() afin que tout sera enregistré (à partir de commentaire).

Pour éviter d'ajouter un doublon, vous pouvez essayer de définir l'état de vos entités sur State.Modified au lieu de State.Added.

La raison de ce problème était que vous étiez en train de mettre à jour uniquement l'entité d'un côté. Si vous avez une relation BankAccounts - Members alors dans le cas où vous mettez à jour la propriété navtigation pour Member, vous devez également mettre à jour une propriété de navigation pour BankAccount et vice versa. Si vous venez de mettre à jour une propriété (Member.Name ou quoi que ce soit) que vous venez de l « State-State.Modified sans affecter d'autres Member » ce Member s, BankAccount « s, etc.

Si le suivi de l'entité est activée pour vous alors EF suivra automatiquement les entités qui ont été modifiées et leur définira des états appropriés.Mais comme je l'ai vu à partir de votre problème, il est désactivé pour vous, vous devez donc définir manuellement l'état de chaque objet que vous souhaitez ajouter/mettre à jour/supprimer.

+0

Oui j'ai déjà trouvé ces liens ... Et c'est ce que j'ai fait. – Naografix

+0

Alors avez-vous essayé tout ce qui est mentionné ici et cela ne vous a pas aidé? De votre description, je ne vois aucune différence critique entre votre problème et les problèmes mentionnés sur ces liens. Je ne vois pas le code complet alors que vous avez plus d'informations vous pourriez être en mesure d'étudier quelles sont les différences et essayer de faire fonctionner le même que dans ces exemples. –

+0

Vérifiez également que vous marquez les entités comme modifiées sur les deux côtés (lorsque vous mettez à jour une propriété de navigation pour le client, vous devez également mettre à jour un BankCheck approprié). Cliquez sur ce lien: http://stackoverflow.com/a/16128818/3731444 –