【问题标题】:SQL Server : two foreign keys pointing to one table. Error: Introducing FOREIGN KEY constraint may cause cycles or multiple cascade pathsSQL Server:两个外键指向一个表。错误:引入 FOREIGN KEY 约束可能会导致循环或多个级联路径
【发布时间】:2016-12-02 04:19:19
【问题描述】:

我收到了错误:

消息 1785,第 16 级,状态 0,第 238 行
在表“Studios”上引入 FOREIGN KEY 约束“FK_Studios_Members_HeadId”可能会导致循环或多个级联路径。指定 ON DELETE NO ACTION 或 ON UPDATE NO ACTION,或修改其他 FOREIGN KEY 约束。

下面是我遇到问题的两个表格的简化版本:

CREATE TABLE [Members] 
(
    [MemberId] int NOT NULL IDENTITY
)

CREATE TABLE [Studios] 
(
    [StudioId] int NOT NULL IDENTITY,
    [HeadId] int,
    [OwnerId] int,

    CONSTRAINT [PK_Studios] PRIMARY KEY ([StudioId]),

    CONSTRAINT [FK_Studios_Members_OwnerId] 
         FOREIGN KEY ([OwnerId]) REFERENCES [Members] ([MemberId]) 
            ON DELETE SET NULL,
    CONSTRAINT [FK_Studios_Members_HeadId] 
         FOREIGN KEY ([HeadId]) REFERENCES [Members] ([MemberId]) 
            ON DELETE SET NULL
)

我发现如果我切换两个FK的顺序,第二个总是会出错。我不明白为什么这会导致级联问题,因为两者都有“ON DELETE SET NULL”。

这是由 EF Core 代码优先生成的,所以我需要这些关系并且不能只在后端触发。

我错过了什么?

【问题讨论】:

标签: sql-server entity-framework foreign-keys code-first


【解决方案1】:

我不确定答案是否适用于您所拥有的东西,我不确定您的设计有多牢固......但作为一种替代设计,我认为不会有相同的问题你考虑过单独的中间关系表吗?

这种方法的一个好处是它允许您在每个位置拥有多个成员。

CREATE TABLE [Members] 
(
    [MemberId] int NOT NULL IDENTITY
)

CREATE TABLE [Studios] 
(
    [StudioId] int NOT NULL IDENTITY,

    CONSTRAINT [PK_Studios] PRIMARY KEY ([StudioId]),

)

--Contains Owner, Head, etc.
CREATE TABLE [Relationships] 
(
    [RelationshipId] int NOT NULL IDENTITY,
    [RelationshipId] nvarchar(20) NOT NULL
)

CREATE TABLE [StudioMemberRelationships]
(
    [StudioMemberRelationshipId] int NOT NULL IDENTITY,
    [StudioId] int NOT NULL,
    [MemberId] int NOT NULL,
    [RelationshipTypeId] int NOT NULL,

    CONSTRAINT [FK_StudioMemberRelationships_StudioId] 
         FOREIGN KEY ([StudioId]) REFERENCES [Studios] ([StudioId]) 
            ON DELETE SET NULL,
    CONSTRAINT [FK_StudioMemberRelationships_MemberId] 
         FOREIGN KEY ([MemberId]) REFERENCES [Members] ([MemberId]) 
            ON DELETE SET NULL,
    CONSTRAINT [FK_StudioMemberRelationships_RelationshipId] 
         FOREIGN KEY ([RelationshipId]) REFERENCES [Relationships] ([RelationshipId]) 
            ON DELETE SET NULL
)

【讨论】:

    猜你喜欢
    • 2019-10-20
    • 2018-08-08
    • 2011-05-08
    • 2013-10-22
    • 2017-04-26
    • 2017-01-26
    相关资源
    最近更新 更多