首先使用复合键和数据库的一对零或一对关系
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
可能包含具有相同 (MeasurementResultId
、ValueType
) 的多行,因此关系的那一侧必须具有类型 *
。在 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])
)
我无法在两个 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
可能包含具有相同 (MeasurementResultId
、ValueType
) 的多行,因此关系的那一侧必须具有类型 *
。在 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])
)