2009-08-15 7 views
0

J'ai beaucoup de tables et certaines d'entre elles ont de nombreuses relations avec d'autres tables. J'ai remarqué les tables qui ont une relation que je suis capable de faire ce qu'il est indiqué dans NerdDinner Chapitre 1.Question sur la relation de clé étrangère dans Linq à Sql

Dinner dinner = db.Dinners.Single(d => d.DinnerID == 1); 
RSVP myRSVP = new RSVP(); 
myRSVP.AttendeeName = "ScottGu"; 

dinner.RSVPs.Add(myRSVP); 

Alors, quand je tente quelque chose de similaire .add montre jamais pour moi à moins qu'il ait comme une relation.

Alors, comment puis-je le faire fonctionner pour plusieurs?

Je ne sais toujours pas ce que cela me fait de toute façon. Est-ce que ça économise en tapant? ou quoi?

+1

Assurez-vous de vérifier Linq Scott Guthrie à tutoriel SQL à http://weblogs.asp.net/scottgu/archive/2007/05/19/using-linq-to-sql-part- 1.aspx –

Répondre

4

OK, nous allons essayer de faire un peu plus clair: voici le schéma NerdDinner de base que vous mentionnez dans votre message:

alt text http://i31.tinypic.com/nejqmu.jpg

La question de savoir si oui ou non vous aurez un « RSVPs » La propriété de style (un "EntitySet") à laquelle vous pouvez ajouter des entités ne dépend pas du fait que vous ayez ou non une ou plusieurs relations - cela dépend de la fin de la relation dans laquelle vous vous trouvez.

La table parent (ici: Dîner) a généralement 0, 1 ou plusieurs entrées de l'enfant dans la table des enfants (ici: RSVP). Donc, dans la table parente, vous devez avoir une propriété "RSVP" qui vous permet de stocker plusieurs entités - une entité EntitySet. Cependant, à partir de la table enfant, l'enfant ne peut jamais être associé exactement à un parent - par conséquent, vous n'avez qu'une seule entité appelée "Dîner" (le dîner auquel ce RSVP est destiné).

Vous voyez clairement lorsque vous cliquez sur la ligne entre les deux entités et regardez ses propriétés:

alt text http://i31.tinypic.com/2f07our.jpg

Le One-To-Many « Cardinalité » Les définit ceci: un parent a beaucoup enfants, mais un enfant n'a qu'un seul parent.

Par conséquent, dans votre code, vous serez en mesure d'écrire ceci:

 NerdDinnerDataContext ctx = new NerdDinnerDataContext(); 

     Dinner upcomingDinner = new Dinner(); 
     upcomingDinner.EventDate = new DateTime(2009, 10, 10); 
     upcomingDinner.Address = "One Microsoft Way, Redmond, WA"; 
     upcomingDinner.ContactPhone = "(555) 123 1234"; 

     upcomingDinner.RSVPs.Add(new RSVP() { AttendeeName = "ScottGu" }); 
     upcomingDinner.RSVPs.Add(new RSVP() { AttendeeName = "ScottHa" }); 
     upcomingDinner.RSVPs.Add(new RSVP() { AttendeeName = "PhilHa" }); 


     RSVP scottHunter = new RSVP(); 
     scottHunter.AttendeeName = "Scott Hunter"; 
     scottHunter.Dinner = upcomingDinner; 

Le parent (dîner) a une collection de RSVPs (un EntitySet, pour être exact, dans LINQ to SQL terminologie), donc vous pouvez avoir

 upcomingDinner.RSVPs.Add(new RSVP() { AttendeeName = "ScottGu" }); 

d'autre part, la propriété enfant « RSVP » ne peut être associé à un seul dîner, il ne dispose pas d'un EntitySet, mais une seule instance d'un "Dîner" pour établir la connexion, et vous écrirez:

 scottHunter.Dinner = upcomingDinner; 

Est-ce que cela rend les choses un peu plus claires? Ce sont vraiment les bases de la modélisation de base de données relationnelle et comment associer les tables parent et enfant les unes aux autres - traduites par Linq-to-SQL en objets et comment ils peuvent être connectés et associés.

Marc

+0

entité de relation unique? Je ne sais pas ce que c'est mais je pense que j'ai quelques relations de 0.1. Comment puis-je dire si. le diagramme dans mssql 2005 montre seulement les clés primaires ou 1 à plusieurs. – chobo2

+0

Je pense que je l'obtiens plus maintenant. Maintenant, avec RSVPs, vous n'avez pas besoin d'ajouter le DinnerId. Je ne suis pas sûr à 100% sur les deux dernières lignes en particulier avec scottHunter.Dinner = upcomingDinner ;. Pourquoi voudriez-vous mettre toutes ces personnes qui sont RSVP dans une personne RSVP? Ou cela ferait-il un objet Dinner et ajouterait "Scott Hunter" comme hébergé par et remplirait d'autres champs. – chobo2

+0

ASsigning le "dîner" à "ScottHunter" assignera ce dîner comme le dîner ScottHunter prévoit d'assister. Il établira une association entre ScottHunter et le «prochain dîner». A partir du "upcomingDinner", vous allez maintenant voir un nouvel objet "RSVP" dans son EntitySet "RSVPs", appelé ScottHunter - il a été ajouté à la liste des participants. À partir de l'objet ScottHunter RSVP, vous verrez le "UpcomingDinner" comme dîner associé auquel il prévoit d'assister. C'est toujours une association à double sens! –

0

Vous avez besoin d'un ajout pour chaque table de la relation.

La méthode Add stocke un objet dans le contexte de données Linq to SQL, de sorte qu'il peut être ajouté à sa table de base de données correspondante. La méthode SubmitChanges enregistre les modifications en attente dans la base de données. Ainsi vous pouvez faire toutes vos additions, et ensuite les commettre immédiatement.

+0

Pouvez-vous donner un exemple s'il vous plaît. Je ne suis pas en train de faire sql à linq pour comme 5 minutes maintenant lol. Donc, je ne sais pas comment faire ces méthodes d'ajout et pas encore 100% clair sur eux. – chobo2

Questions connexes