Entity Framework ne sauvegarde pas les modifications sur une nouvelle entité avec une relation à deux niveaux

entity-framework savechanges

Question

Je construis un site ASP.NET MVC à l'aide de ADO.NET Entity Framework. J'ai un modèle d'entité qui inclut ces entités, associées par des clés étrangères:

Rapport (ID, date, titre, Report_Type_ID, etc.)

  • Sous-rapport (ID, ReportText, etc.) - Relation un à un avec le rapport.
    • ReportSource (ID, Nom, Description) - Relation un à plusieurs avec Sub_Report.
      • ReportSourceType (ID, Nom, Description) - relation un à plusieurs avec ReportSource.
      • Contact (ID, nom, adresse, etc.) - relation de un à un avec Report_Source.

Il existe une page Create.aspx pour chaque type de SubReport. La méthode post event renvoie une nouvelle entité Sub_Report.

Avant, dans ma méthode de publication, je suivais ce processus:

  1. Définissez les propriétés d'une nouvelle entité de rapport à partir des champs de la page.
  2. Définissez les propriétés spécifiques de l'entité SubReport à partir des champs de la page.
  3. Définissez le rapport de l'entité SubReport sur la nouvelle entité de rapport créée dans 1.
  4. Etant donné un identifiant fourni par la page, recherchez ReportSource et définissez ReportSource de l'entité Sub_Report sur l'entité trouvée.
  5. Sauvegarder les modifications.

Ce flux de travail a bien fonctionné pendant quelques semaines. Puis la semaine dernière, quelque chose a changé et cela ne fonctionne plus. Maintenant, au lieu de l'opération de sauvegarde, j'obtiens cette exception:

UpdateException: "Entities in 'DIR2_5Entities.ReportSourceSet' 
participate in the 'FK_ReportSources_ReportSourceTypes' relationship. 
0 related 'ReportSourceTypes' were found. 1 'Report_Source_Types' is expected."

Le visualiseur de débogage affiche les éléments suivants:

  • ReportSource du sous-rapport est défini et chargé et toutes ses propriétés sont correctes.
  • Report_Source est associé à une entité ReportSourceType valide.

Dans SQL Profiler, l'instruction SQL préparée semble correcte. Quelqu'un peut-il m'indiquer quelle chose évidente me manque?

TIA

Remarques: Le rapport et le sous-rapport sont toujours de nouvelles entités dans ce cas. L'entité Report contient des propriétés communes à de nombreux types de rapports et est utilisée pour les requêtes génériques. Les sous-rapports sont des rapports spécifiques avec des paramètres supplémentaires variant selon le type. Il existe en fait une entité différente pour chaque type de SubReport, mais cette question s’applique à tous. J’utilise donc SubReport comme exemple simplifié.

Réponse acceptée

Cela a tendance à se produire si vos tables de base de données ont une relation 1 à 1 entre elles. Dans votre exemple, reportsourceset s'attend à ce que reportsorttypes contienne l'identifiant référencé. J'ai rencontré ce problème lorsque ma relation lie deux clés principales provenant de tables opposées.


Réponse populaire

Je me rends compte que je suis en retard pour cela, mais j'avais un problème similaire et je l'ai piraté pendant environ 3 heures avant de trouver une solution. Je poste le code, mais c'est à la maison - je peux le faire plus tard si quelqu'un en a besoin.

Voici quelques points à vérifier:

  • Définissez un point d'arrêt sur l'appel SaveChanges () et examinez le contexte de l'objet en profondeur. Vous devriez voir une liste des ajouts et des changements apportés au contexte. Lorsque j'ai regardé pour la première fois, j'ai constaté qu'il essayait d' ajouter tous mes objets liés plutôt que de simplement les pointer. Dans votre cas, le contexte tente peut-être d'ajouter un nouveau type de rapport_source_source.
  • Par rapport au point précédent, mais si vous récupérez la source du rapport, assurez-vous qu’elle est extraite de la base de données par sa clé d’entité et correctement attachée au contexte. Sinon, votre contexte pourrait croire qu'il s'agit d'un nouvel élément et, par conséquent, ses relations requises ne seront pas définies.

De mémoire, j'ai extrait mes références à l'aide de la méthode context.GetObjectByKey , puis j'ai explicitement associé ces objets au contexte à l'aide de la méthode context.Attach avant de les affecter aux propriétés de mon objet d'origine.



Related

Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi