关于Linq到Sql的外键关系的问题

时间:2009-08-15 06:57:10

标签: linq-to-sql

我有很多表,其中一些表与其他表有很多关系。我注意到有一种关系的表我可以做NerdDinner第1章中显示的那些。

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

dinner.RSVPs.Add(myRSVP);

所以,当我尝试类似的东西时,除非它有一种关系,否则永远不会出现在我面前。

那么如何让它适用于多个?

我仍然不清楚这对我有什么影响。就像打字一样省吗?或者什么?

2 个答案:

答案 0 :(得分:4)

好的,让我们试着让它更清楚一点:这是您在帖子中提到的基本NerdDinner架构:

alt text

您是否拥有可以添加实体的“RSVP”样式属性(“EntitySet”)的问题不依赖于您是否有一个或多个关系的事实 - 这取决于你们之间关系的哪一端。

父表(此处:晚餐)在子表(此处为:RSVP)中通常包含0个,1个或多个子条目。

因此,在父表中,您必须拥有一个属性“RSVP”,允许您存储多个实体 - EntitySet

然而,从子表中,孩子只能与一个父母相关联 - 因此,您只有一个名为“Dinner”的实体(此RSVP的晚餐)

当您单击两个实体之间的线并查看其属性时,您会清楚地看到:

alt text

“基数”一对多定义如下:父母有很多孩子,但孩子只有一个孩子。

因此,在您的代码中,您将能够写下这个:

        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;

父(Dinner)有一组RSVP(一个EntitySet,确切地说,在Linq-to-SQL术语中),因此你可以拥有

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

另一方面,子属性“RSVP”只能与一个Dinner相关联,因此它没有EntitySet,而只是一个“Dinner”的单个实例来建立连接,而你'我会写:

        scottHunter.Dinner = upcomingDinner;

这会让事情变得更清晰吗?它实际上是关系数据库建模的基础知识,以及如何将父表和子表相互关联 - 由Linq-to-SQL转换为对象以及它们如何连接和关联。

马克

答案 1 :(得分:0)

您需要为关系中的每个表添加一个。

Add方法将对象分级为Linq to SQL数据上下文,以便可以将其添加到其对应的数据库表中。 SubmitChanges方法将所有挂起的更改保存到数据库。因此,您可以执行所有添加,然后立即提交。