【问题标题】:Creating a one-to-one relationship建立一对一的关系
【发布时间】:2011-04-20 00:52:56
【问题描述】:

我有两个对象,一个 Press 和一个 Stitching:

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;

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

编辑:

我听从了另一个论坛用户的建议并运行了这个脚本来创建两者之间的关系并防止 Stitching 与多个 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 有一个 Stitching,但一个 Stitching 有多个 Press 实体。我更新了 .edmx 设计器中的关系,以便印刷机具有零或一的缝合,而缝合具有设备之一。但我不知道这是否足够。这里有什么建议吗?

【问题讨论】:

  • 不完全是重复的,但this post 应该会给你一个好主意。
  • @Bala - 是的,我看到了,最重要的答案是“对于一对一的关系,EF 希望这些表使用相同的主键。”但我不知道该怎么做。两个表一个主键?
  • “当用户创建印刷机时,他们可以选择为该印刷机创建一个拼接”——然后是 1:0..1(“一到零或一") 关系,而不是真正的 1:1 关系。
  • @onedaywhen - 你是对的,我的错。你知道怎么做吗? :)

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


【解决方案1】:

如果 Press 和 Stitching 之间的关系是一对一的,并且没有理由将 Stitching 放在单独的表中(即 Stitching 仅与 Press 相关联,没有其他类),那么最好移动 Stitching属性转化为按

PressID
Name 
StitchingName
StitchingCost

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

在 .net 中,我将创建 StitchingCost 和可为空的类型。 IE。 float? StitchingCost;

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

例子:

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

【讨论】:

  • 实际上,我需要创建大约 30 个其他表的关系:Binding、Folding 等。我只是以一个为例。所以我想要一对一的关系,这样我就可以避免让我的 Press 表有 200 个字段,而其中一半以上为 NULL
  • 实际上,Steven 的表格比您的建议更高。
【解决方案2】:

我认为StitchingID 应该是Primary KeyForeign KeyPressID

【讨论】:

    【解决方案3】:

    我不明白你为什么想要一个 StichingID,除非 Stichings 可以与印刷机以外的东西相关联。如果这是您所说的,并且每台印刷机可以有一个或零个缝合,那么缝合表应该作为印刷机的附加表。不使用 StichingID,而是将 Stiching 表中的主键设为 PressID。因此直接强制执行 1:0-1 关系。我相信 Entity Framework 应该可以轻松识别这一点。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-11-22
      • 1970-01-01
      • 2023-04-11
      • 2011-06-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多