【问题标题】:One to zero or one relationship using composite key and database first首先使用复合键和数据库的一对零或一对关系
【发布时间】:2015-05-04 14:18:41
【问题描述】:

我未能在两个表之间创建 1 到 0..1 的关系,其中主键是由两列组成的复合键。

表以多对多关系导入 EF,将关系更改为 1 到 0..1 或 1 到 1 会导致以下错误:

多重性在角色中无效,因为从属角色 属性不是关键属性,的上限 依赖角色的多重性必须是 *

主表:

CREATE TABLE [dbo].[MeasurementBlobs] (
    [MeasurementResultId]   INT NOT NULL,
    [ValueType]             SMALLINT NOT NULL,
    [Id]                    UNIQUEIDENTIFIER ROWGUIDCOL NOT NULL,
    [Value]                 VARBINARY(MAX) FILESTREAM NOT NULL,
    CONSTRAINT [PKMeasurementBlobs] PRIMARY KEY CLUSTERED ([MeasurementResultId], [ValueType]),
    CONSTRAINT [FKMeasurementBlobsMeasurementResults] FOREIGN KEY ([MeasurementResultId]) REFERENCES [dbo].[MeasurementResults] ([Id]),
    CONSTRAINT [UQMeasurementBlobsId] UNIQUE ([Id])
)
GO

外键表:

CREATE TABLE [dbo].[MeasurementBlobsMeasurementClusters]
(
    [MeasurementResultId]   INT NOT NULL,
    [ValueType]             SMALLINT NOT NULL,
    [MeasurementClusterId]  INT NOT NULL,
    CONSTRAINT [PKMeasurementBlobsMeasurementClusters] PRIMARY KEY CLUSTERED ([MeasurementResultId], [ValueType]  ASC, [MeasurementClusterId] ASC),
    CONSTRAINT [FKMeasurementBlobsMeasurementClustersMeasurementBlob] FOREIGN KEY ([MeasurementResultId], [ValueType]) REFERENCES [dbo].[MeasurementBlobs] ([MeasurementResultId], [ValueType]),
    CONSTRAINT [FKMeasurementBlobsMeasurementClustersMeasurementCluster] FOREIGN KEY ([MeasurementClusterId]) REFERENCES [dbo].[MeasurementClusters] ([Id])
)
GO

每个类型继承都使用 table table 不是一种选择。

【问题讨论】:

  • 模型首先假设您使用 edmx 来生成数据库;鉴于您在这里有 SQL 并声明表已导入 EF,这看起来是数据库优先。另外,当您说“表是通过多对多关系导入的”时,您是什么意思?我没有看到多对多中需要的第三张表?
  • "将关系更改为 1 到 0..1 或 1 到 1" 你是怎么做到的?请出示地图。
  • @Claies 当然是你的权利,首先将标题更改为数据库。好吧,没有第三张桌子,它们是这样导入的。

标签: c# sql sql-server entity-framework ef-model-first


【解决方案1】:

对于您描述的关系多重性,您的数据库结构不正确。表MeasurementBlobsMeasurementClusters 可能包含具有相同(MeasurementResultIdValueType)的多行,因此关系的那一侧必须具有类型*。在 FK 上放置唯一性约束,以允许这一侧具有多重性 0..1

关系的另一端依赖于表MeasurementBlobs的PK,这在那个表中当然是唯一的。虽然也许您可以将该方建模为“多”,但您应该将其建模为1。如果你想将这一边的多重性赋值为0..1,那么在other表中你必须使引用该表的外键可以为空。

更新:甚至比在MeasurementBlobsMeasurementClusters 中对 FK 设置单独的唯一性约束更好的是从其 PK 中删除 MeasurementClusterId 列,只留下 FK 的两列。如果 FK 必须在表中确实是唯一的,那么它本身就是一个非常合适的 PK。当然,在这种情况下,问题就出现了,为什么需要使用单独的表而不是直接的 FK 关系来建模集群 测量 blob 关系。

【讨论】:

  • 我已经尝试过外键的唯一约束,但没有帮助。我也不能将外键设置为可为空,同时作为外表的主键。也许这才是真正让 EF 感到困惑的问题。
  • 如果其他两列足以唯一标识一行,为什么 MeasurementClusterId 是其表的 PK 的一部分?或者如果其他两个不足以唯一标识一行,那么这相当于 EF 的投诉。
  • 您的 EF 对如何构建数据库以建模各种关系多重性有特定的期望,显然它需要 1:1 和 1:0..1 关系来通过实体的 PK,而不仅仅是通过独特的 FK。根据我之前的评论,我已经用另一种选择更新了我的答案。
  • 问题确实是外键表的主键,因为它是由一个附加列组成的。感谢您的帮助!
【解决方案2】:

问题是由外键表的主键引起的。

主键由三列组成,比外键所需的多一列。这是工作外键表定义:

CREATE TABLE [dbo].[MeasurementBlobsMeasurementClusters]
(
    [MeasurementResultId]   INT NOT NULL,
    [ValueType]             SMALLINT NOT NULL,
    [MeasurementClusterId]  INT NOT NULL,
    [IsFaultSource]         BIT NOT NULL,
    CONSTRAINT [PKMeasurementBlobsMeasurementClusters] PRIMARY KEY CLUSTERED ([MeasurementResultId], [ValueType]),
    CONSTRAINT [FKMeasurementBlobsMeasurementClustersMeasurementBlob] FOREIGN KEY ([MeasurementResultId], [ValueType]) REFERENCES [dbo].[MeasurementBlobs] ([MeasurementResultId], [ValueType]),
    CONSTRAINT [FKMeasurementBlobsMeasurementClustersMeasurementCluster] FOREIGN KEY ([MeasurementClusterId]) REFERENCES [dbo].[MeasurementClusters] ([Id])
)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-18
    • 1970-01-01
    • 2014-01-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多