Проблема множественности первой таблицы для типа базы данных EF6 для внешнего ключа

Я новичок в EF, поэтому надеюсь, что это не глупый вопрос. Я искал, но ничего не нашел по моей проблеме.

У меня возникли проблемы с моделированием существующей базы данных в EF6. У меня есть настройка наследования TPT следующим образом:

модель TPT Мне пришлось вручную добавить таблицы BAMS*Environment из-за проблем с созданием модели . Все в порядке, пока я не добавлю внешний ключ из BAMSPortalEnvironment в BAMSPrimeEnvironment. Для данной среды Prime может быть среда Portal, а может и не быть, но для каждой среды Portal есть среда Prime.
Я получаю следующую ошибку от VS2017:

Запуск преобразования: множественность недопустима в роли «BAMSPortalEnvironment» в отношении «FK_BAMSPortalEnvironment_BAMSPrimeEnvironment». Поскольку свойства зависимой роли не являются ключевыми свойствами, верхняя граница кратности зависимой роли должна быть *.

Упрощенная модель соответствующих таблиц:

CREATE TABLE dbo.Environment(
  EnvironmentId     int IDENTITY(1,1) NOT NULL,
  EnvironmentTypeId char(1) NOT NULL,
  [Description]     varchar(64) NOT NULL,
  CONSTRAINT UQ_Environment UNIQUE NONCLUSTERED (EnvironmentId ASC) ON [PRIMARY],
  CONSTRAINT PK_Environment PRIMARY KEY CLUSTERED (EnvironmentId ASC, EnvironmentTypeId ASC) ON [PRIMARY]
) ON [PRIMARY];

CREATE TABLE dbo.BAMSPrimeEnvironment(
    EnvironmentId       int NOT NULL,
    EnvironmentTypeId   AS CAST('B' AS char(1)) PERSISTED NOT NULL,
    CONSTRAINT FK_BAMSPrimeEnvironment_Environment FOREIGN KEY (EnvironmentId, EnvironmentTypeId) REFERENCES dbo.Environment (EnvironmentId, EnvironmentTypeId) ON UPDATE NO ACTION ON DELETE CASCADE,
    CONSTRAINT PK_BAMSPrimeEnvironment PRIMARY KEY CLUSTERED (EnvironmentId ASC, EnvironmentTypeId ASC) ON [PRIMARY]
) ON [PRIMARY];

CREATE TABLE dbo.BAMSPortalEnvironment(
    EnvironmentId       int NOT NULL,
    EnvironmentTypeId   AS CAST('P' AS char(1)) PERSISTED NOT NULL,
    BAMSPrimeId         int NOT NULL,
    BAMSPrimeTypeId     AS CAST('B' AS char(1)) PERSISTED NOT NULL,
    CONSTRAINT FK_BAMSPortalEnvironment_BAMSPrimeEnvironment FOREIGN KEY (BAMSPrimeId, BAMSPrimeTypeId) REFERENCES dbo.BAMSPrimeEnvironment (EnvironmentId, EnvironmentTypeId) ON UPDATE NO ACTION ON DELETE NO ACTION,
    CONSTRAINT FK_BAMSPortalEnvironment_Environment FOREIGN KEY (EnvironmentId, EnvironmentTypeId) REFERENCES dbo.Environment (EnvironmentId, EnvironmentTypeId) ON UPDATE NO ACTION ON DELETE CASCADE,
    CONSTRAINT UQ_BAMSPortalEnvironment_BAMSPrimeId_BAMSPrimeTypeId UNIQUE NONCLUSTERED (BAMSPrimeId ASC, BAMSPrimeTypeId ASC) ON [PRIMARY],
    CONSTRAINT PK_BAMSPortalEnvironment PRIMARY KEY CLUSTERED (EnvironmentId ASC, EnvironmentTypeId ASC) ON [PRIMARY]
) ON [PRIMARY];

Я могу «исправить» это, изменив «0..1» на «*», но это не точно описывает мою модель. Чего мне не хватает, чтобы заставить это работать?

Это мой первый пост, поэтому, если вам нужна дополнительная информация, дайте мне знать.

Спасибо!


person Brandon L    schedule 22.08.2017    source источник
comment
Это поможет, если вы примените уникальное ограничение к BAMSPrimeEnvironment, что-то вроде этого CONSTRAINT UQ_EnvironmentID_EnvironmentType UNIQUE NONCLUSTERED (EnvironmentId ASC, EnvironementType) ON [PRIMARY],   -  person ironstone13    schedule 22.08.2017
comment
Я не понимаю предложения. В таблице уже есть первичный ключ для этих столбцов, который уникален. Насколько я знаю, EF6 не поддерживает уникальные ограничения, только первичные ключи.   -  person Brandon L    schedule 23.08.2017
comment
О, извините, я не заметил, что у вас уже есть составной ПК для обоих этих столбцов, я думал, что это только для EnvironmentId. Это очень странно, в обеих таблицах у вас есть составные ПК, поэтому это отношение явно 0..1, а не *. Может быть, EF просто не поддерживает такой сценарий и неявно рассматривает каждый FK как один ко многим?   -  person ironstone13    schedule 23.08.2017


Ответы (1)


Я не смог найти решение, поэтому вместо BAMSPortalEnvironment, ссылающегося на BAMSPrimeEnvironment, я изменил его на ссылку на Environment, что решило эту проблему.

person Brandon L    schedule 13.09.2017