От одного до нуля или от одного отношения с использованием составного ключа и базы данных

Мне не удается создать отношение от 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

Использование таблицы таблицы для наследования типов не вариант.

2 ответа

Решение

Структура вашей базы данных неверна для множества описанных вами отношений. Таблица MeasurementBlobsMeasurementClusters может содержать несколько строк, имеющих одинаковые (MeasurementResultId, ValueType), поэтому эта сторона отношений должна иметь тип *, Поместите ограничение уникальности на FK, чтобы позволить этой стороне иметь кратность 0..1,

Другая сторона отношений зависит от ПК таблицы MeasurementBlobsчто, конечно, уникально в этой таблице. Хотя, возможно, вы можете смоделировать эту сторону как "многие", вы должны смоделировать ее как 1, Если вы хотите назначить кратность этой стороне как 0..1, то в другой таблице вы должны сделать внешний ключ, ссылающийся на эту таблицу, обнуляемым.

Обновление: даже лучше, чем отдельное ограничение уникальности для FK в MeasurementBlobsMeasurementClusters будет удалить MeasurementClusterId колонка от его PK, оставляя только две колонки FK. Если FK действительно должен быть уникальным в таблице, то это совершенно подходящий PK сам по себе. Конечно, в этом случае возникает вопрос о том, почему вам нужно смоделировать кластерное <-> отношение измерительного объекта с отдельной таблицей, а не с прямым отношением FK.

Проблема была вызвана первичным ключом таблицы внешнего ключа.

Первичный ключ состоит из трех столбцов, на один больше, чем необходимо для внешнего ключа. Вот определение рабочей таблицы внешнего ключа:

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])
)
Другие вопросы по тегам