【问题标题】:EF6 Database First Table-per-Type multiplicity issue on foreign key关于外键的 EF6 Database First Table-per-Type 多重性问题
【发布时间】:2017-09-13 19:52:08
【问题描述】:

我对 EF 还很陌生,所以我希望这不是一个愚蠢的问题。我进行了搜索,但找不到与我的问题相关的任何内容。

我在 EF6 中对现有数据库进行建模时遇到问题。我的 TPT 继承设置如下:

TPT model 由于创建模型的问题,我必须手动添加 BAMS*Environment 表。在我将 BAMSPortalEnvironment 中的外键添加到 BAMSPrimeEnvironment 之前,一切都很好。对于给定的 Prime 环境,可能有也可能没有 Portal 环境,但对于每个 Portal 环境,都有一个 Prime 环境。
我从 VS2017 收到以下错误:

运行转换:关系“FK_BAMSPortalEnvironment_BAMSPrimeEnvironment”中的角色“BAMSPortalEnvironment”中的多重性无效。由于 Dependent Role 属性不是关键属性,因此 Dependent Role 的多重性上限必须为 *。

相关表格的简化模型:

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”更改为“*”来“解决”这个问题,但这并不能准确地描述我的模型。让这个工作我缺少什么?

这是我的第一篇文章,如果您需要更多信息,请告诉我。

谢谢!

【问题讨论】:

  • 如果你在BAMSPrimeEnvironment 上应用一个独特的约束会有帮助吗,比如CONSTRAINT UQ_EnvironmentID_EnvironmentType UNIQUE NONCLUSTERED (EnvironmentId ASC, EnvironementType) ON [PRIMARY],
  • 我不明白这个建议。该表在这些列上已经有一个主键,这是唯一的。 AFAIK,EF6 不支持唯一约束,只支持主键。
  • 哦,抱歉,我没有注意到您已经在 both 这两个列上进行了 composite PK,我以为只有在 @987654325 上@。这很奇怪,在两个表中都有复合 PK,所以这种关系显然是 0..1 而不是 *。也许 EF 只是不支持这种情况,并且隐含地将每个 FK 视为一对多?

标签: c# entity-framework-6 ef-database-first


【解决方案1】:

我找不到解决方案,因此我没有将 BAMSPortalEnvironment 引用为 BAMSPrimeEnvironment,而是将其更改为引用 Environment,从而解决了此问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-07
    • 1970-01-01
    相关资源
    最近更新 更多