建立一对一的关系

本文关键字:关系 一对一 建立 | 更新日期: 2023-09-27 17:50:42

我有两个对象,一个是Press,一个是stitch:

Press
------------------
PressID
Name
Stitching
------------------
StitchingID
Name
Cost

在我的网站上,当用户创建新闻时,他们可以选择为该新闻创建一个拼接。压力机不需要缝合。

我正在使用实体框架4,如果我从数据库中得到一个Press对象,我希望能够说:

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

我还希望能够做到:

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

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

编辑:

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

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文件时,我仍然得到一对多关系。一个Press有一个sewing,但是一个sewing有多个Press实体。我更新了.edmx设计器中的关系,使Press具有0或1的缝线,而缝线具有1的设备。但我不知道这是否足够。有什么建议吗?

建立一对一的关系

如果Press和拼接之间的关系是一对一的,并且没有理由将拼接放在单独的表中(即拼接只与Press类关联,不与其他类关联),那么最好将拼接属性移动到Press

中。
PressID
Name 
StitchingName
StitchingCost

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

在。net中,我将使StitchingCost和nullable类型。ie。float? StitchingCost;

这将允许您检查是否已添加了拼接细节。

的例子:

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

我认为StitchingID应该是一个Primary Key和一个Foreign KeyPressID

我不明白为什么你想要一个StichingID,除非Stichings可以与新闻界以外的东西相关联。如果这是你所说的,每台印刷机可以有一个或零个缝合,那么缝合表应该作为印刷机的附加表。不要使用StichingID,而是将Stiching表中的主键改为PressID。因此直接执行1:0-1关系。我相信实体框架应该没有问题识别这个