首先使用复合键和数据库的一对零或一对关系

One to zero or one relationship using composite key and database first

我无法在两个 table 之间创建 1 对 0..1 的关系,其中主键是由两列组成的复合键。

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

Multiplicity is not valid in Role Because the Dependent Role properties are not the key properties, the upper bound of the multiplicity of the Dependent Role must be *

小学table:

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

外键table:

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 不是一个选项。

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

对方的关系靠着tableMeasurementBlobs的PK,当然独树一帜在那table。虽然也许您 可以 将那一侧建模为 "many",但您 应该 将其建模为 1。如果你想把这边的重数赋值为0..1,那么在othertable你必须让引用这个table的外键是可为空。

更新: 甚至比在 MeasurementBlobsMeasurementClusters 中对 FK 放置单独的唯一性约束更好的方法是从其 PK 中删除 MeasurementClusterId 列,留下只有 FK 的两列。如果 FK 在 table 中确实必须是唯一的,那么它本身就是一个完美的 suitable PK。当

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

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

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])
)