1

J'ai deux tables Plantes et informations. Pour chaque plante, il y a beaucoup d'informations, mais pour chaque plante il y a une seule information principale. Il y a donc une relation un-à-plusieurs et une relation un-à-un entre les deux. La table Information a un PlantID et la table Plants a un MainInformationID. Je veux que les deux champs dans les deux tables ne soient pas null. Mais maintenant vous ne pouvez pas insérer l'un ou l'autre des deux enregistrements dans leurs tables, car chacun d'eux nécessite que leurs champs ne soient pas nuls, ce qui signifie qu'ils ont besoin que l'autre enregistrement soit créé en premier pour se créer. Peut-être que ce n'est pas une bonne conception de base de données et quelque chose devrait être changé? (Je suis nouveau aux bases de données et au cadre d'entité)Problème d'insertion de relation de base de données à double connexion

J'ai essayé d'insérer dans la base de données elle-même manuellement mais je ne peux pas le faire. J'ai également essayé ce code avec EntityFramework.

using (var context = new MyEntities()) 
     { 
      var p = new Plant() 
      { 
       LatinName = "latinNameTest", 
       LocalName = "localNameTest", 
       CycleTime = 500 
      }; 

      var i = new Information() 
      { 
       ShortDescription = "ShortDesc", 
       LongDescription = "LongDesc" 
      }; 

      p.MainInformation = i; 
      i.Plant = p; 

      context.AddToPlants(p); 
      context.AddToInformation(i); 

      context.SaveChanges();     
     } 

Répondre

2

L'un des

  • La 1-1 colonne FK doit être NULL
  • Le FK doit être désactivé pour permettre insertion parent avant enfant
  • Vous avez une seule fausse ligne d'information qui est utilisée par défaut dans la colonne FL

SQL Server ne permet pas de contrainte différée contrôle sans droits de « changement de code » de sorte que même emballage dans une transaction ne fonctionnera pas

Semble comme un schéma EAV, qui a d'autres problèmes

+0

Je vais aller avec la première option, j'ai également considéré la troisième option, mais nous ne l'avons pas fait. Je suis intéressé par la deuxième option que vous avez mentionnée. Pourrait expliquer un peu plus sur la façon de le faire? – synepis

+0

ALTER TABLE MyTable NOCHECK CONTRAINT FK ... http://msdn.microsoft.com/fr-fr/library/ms190273(SQL.90).aspx – gbn

+0

Aussi, j'ai répondu ici: http://stackoverflow.com/questions/737115/contraintes-de-blocage-temporairement/737167 # 737167 – gbn

2

Vous devez modifier les tables pour autoriser null. Il n'y a pas d'autre moyen de le faire.

+0

L'une des deux tables de toute façon. Il peut être judicieux de modifier les exigences pour que les informations ne puissent être ajoutées qu'à une usine, mais l'usine peut uniquement affecter les informations principales à l'un de ses enregistrements d'informations existants. –

+0

@downvoter: n'hésitez pas à expliquer. – Hogan

+0

Je ne suis pas l'électeur descendant, mais je pense que votre réponse est factuellement incorrecte. @gbn donne d'autres choix, un quatrième serait de diviser la relation en une table séparée. –

0

Vous pouvez examiner les transactions de base de données et comment les utiliser avec Entity Framework. Vous pouvez envelopper les deux INSERTS dans une seule transaction db afin que les deux seuls résultats soient entrés ou aucun ne pénètre.

Here est un lien pour les transactions utilisant EF. Je ne l'ai pas lu mais il semble en parler assez pour vous aider à démarrer.

+1

Cela ne fonctionnera pas parce que les FK sont vérifiés pour chaque déclaration dans la transaction – gbn