建立一对一的关系

时间:2011-04-20 00:52:56

标签: c# asp.net sql entity-framework

我有两个对象,一个按和一个拼接:

Press
------------------
PressID
Name

Stitching
------------------
StitchingID
Name
Cost

因此,在我的网站上,当用户创建印刷机时,他们可以选择为该印刷机创建拼接。印刷机不必缝合。

我正在使用Entity Framework 4,如果我从数据库中获得Press对象,我希望能够说:

Press p = getPressFromDB(pressId);
if (p.Stitching != null)
{
    float cost = p.Stitching.Cost;
}

我也希望能够做到:

Stitching s = getStitchingFromDB(stitchingId);
Press p = s.Press;

如何在这两个表之间建立一对一的关系?

修改

我遵循了另一个论坛上用户的建议并运行此脚本来创建两者之间的关系,并防止拼接与多个Presses关联:

CREATE TABLE PressStitching (PressID int NOT NULL PRIMARY KEY, StitchingID int NOT NULL,
CONSTRAINT FK_PressStitching_Press FOREIGN KEY(PressID) REFERENCES Press(PressID),
CONSTRAINT FK_PressStitching_Stitching FOREIGN KEY(StitchingID) REFERENCES Stitching(StitchingID),
CONSTRAINT UNQ_Stitching UNIQUE(StitchingID))

但是当我更新我的.edmx文件时,我仍然会得到一对多的关系。印刷机有一个拼接,但拼接有多个印刷实体。我更新了.edmx设计师中的关系,以便Press有零或一个拼接,而Stitching有一个装备。但我不知道这是否足够。这里有什么建议吗?

3 个答案:

答案 0 :(得分:0)

如果Press和Stitching之间的关系是一对一的,并且没有理由将Stitching放在一个单独的表中(即Stitching只与Press相关而没有其他类),那么移动拼接会更好属于按

PressID
Name 
StitchingName
StitchingCost

这使您的模型设计更加简单,数据库也能正确规范化。

在.net中,我会制作StitchingCost和Nullable类型。即。 float? StitchingCost;

然后,您可以检查是否添加了拼接细节。

示例:

Press p = getPressFromDB(pressId);
if (p.StitchingCost.HasValue)
{
    float cost = p.StitchingCost.Value
}

答案 1 :(得分:0)

我认为StitchingID应该是Primary Key,还有Foreign KeyPressID

答案 2 :(得分:0)

我不明白为什么你想要一个StichingID,除非Stichings可以与除了印刷之外的东西相关联。如果它是你所说的并且每个印刷机可以有一个或零个stichings,那么stiching table应该作为Presses的附加表。而不是使用StichingID,Stiching表中的主键是PressID。因此,直接强制执行1:0-1关系。我相信实体框架应该毫不费力地认识到这一点。