0

J'ai deux tables dans mon application. Le premier, Sections, stocke le contenu d'une section spécifique d'une publication en ligne. Cela contient (entre autres choses) le titre de la section et un champ CurrentRevisionId (FK).Ajout de deux entités avec des FK pointant entre elles

Une deuxième table, Révisions, stocke différentes révisions de ce contenu. Il a un champ PK RevisionId (le FK ci-dessus, utilisé pour indiquer la révision en cours), le contenu HTML lui-même et SectionId (FK), spécifiant à quelle section appartient la révision.

Donc, fondamentalement, j'ai ces deux FK pointant les uns vers les autres. Lorsque je crée une nouvelle section, l'entité enfant CurrentRevision est également remplie avec ce contenu. Mais le InsertOnSubmit échoue avec cette erreur:

The INSERT statement conflicted with the FOREIGN KEY constraint "FK_Sections_Revisions". The conflict occurred in database "xxxx", table "xxxx.Sections", column 'SectionID'. The statement has been terminated.

Je pense qu'il ne peut pas en même temps créer les lignes et les remplir avec de l'autre PKs.

Dois-je d'abord insérer la section, puis la révision (avec PK de la section), puis mettre à jour la section avec le PK de révision? Ou y a-t-il une solution meilleure/plus élégante à cela?

EDIT: J'ai attaché un screencap des deux tables avec leurs relations. Chaque section a de nombreuses révisions (FK SectionID à l'intérieur du tableau des révisions). En outre, il existe une relation un-à-un dans laquelle le champ CurrentRevisionId de la section pointe vers la révision "actuelle". Cette révision "actuelle" est l'endroit où l'application tire le HTML. J'espère que ça clarifie un peu les choses.

alt text

+0

juste une suggestion, pensez à ajouter un screencap de votre modèle, va rendre la vie plus facile pour tout le monde. parce que je ne comprends pas comment cela pourrait même fonctionner d'un point de vue pure base de données (et encore moins EF). est-ce un 1-1 ou 1- *, ou peut-être un beaucoup plus? – RPM1984

+0

@ RPM1984, merci pour la suggestion, j'ai ajouté le screencap et quelques précisions sur les relations :) –

Répondre

2

Vous ne pouvez pas avoir FK de 2 tables de pointage à l'autre; cela n'a aucun sens.

Si vous essayez de modéliser une relation plusieurs-à-plusieurs, vous devrez créer une table de mappage entre les deux tables. Il contiendra (au minimum) deux clés étrangères, une à chacune de vos deux clés primaires.

+2

Oui, c'est le point que je voulais comprendre. Un point sur ce point, si vous créez la table de jonction avec rien d'autre que les FK, EF n'aura même pas besoin de cartographier cela comme une entité, il est assez intelligent pour être "conscient" de la table de jonction sans avoir explicitement besoin de le modèle. Cool. – RPM1984

+0

@ RPM1984: HTH ... –

+0

Après réflexion, je suis d'accord que les deux FK n'a pas beaucoup de sens.Cependant, je ne pense pas que ce soit une relation plusieurs-à-plusieurs. Chaque section a beaucoup de révisions, donc j'ai mis le FK dans les révisions. Cependant, l'un d'entre eux doit être "actuel". –

1

Si le contenu de la révision est stocké dans la table REVISIONS, je ne trouve pas nécessaire d'avoir le champ RevisionID dans la table SECTIONS.

Lorsque différentes révisions sont créées pour la même section, de nouvelles lignes peuvent être ajoutées à la table REVISIONS avec FK (SectionID) référençant la table SECTIONS.

SECTIONS: SectionID (PK) | SectionData ..

RÉVISIONS: RevisionID (PK) | SectionID (FK) | RevisionData ...

Questions connexes