问题描述
我正在尝试为以下情况创建正确的数据库结构:
我的数据库:
- 有多个帐户
- 一个帐户可以是多个组织的成员=> OrganizationMember
- 一个组织有多个部门
- 一个OrganizationMember可以是多个Sections的成员=> SectionMember
我要级联删除的目的:
- 删除部分时,我希望在所有连接的SectionMembers上级联删除
- 当我删除OrganizationMember时,我希望在所有连接的SectionMembers上级联删除
- 删除组织时,我希望在所有连接的OrganizationMembers和Sections(包括其SectionMembers)上进行级联删除
- 删除帐户时,我希望在所有连接的OrganizationMembers(包括其SectionMembers)上进行级联删除
我试图创建这样的表:
- 帐户{ID,account_fields}
- 组织{ID,organization_fields}
- 节{ID,OrganizationID,section_fields}
- OrganizationMember {ID,帐户ID,OrganizationID,organizationMember_fields}
- SectionMember {ID,SectionID,OrganizationMemberID,sectionMember_fields}
现在,当我创建表时出现错误:
在表“ SectionMembers”上引入FOREIGN KEY约束“ FK_SectionMembers_Sections_SectionId”可能会导致循环或多个级联路径。
我找到了这个答案:https://stackoverflow.com/a/3548225。这似乎是我的情况,但是建议的解决方案无法解决我级联删除的目的。
info: Microsoft.EntityFrameworkCore.Database.Command[20101]
Executed DbCommand (7ms) [Parameters=[],CommandType='Text',CommandTimeout='30']
CREATE TABLE [Accounts] (
[Id] int NOT NULL IDENTITY,[IdentityObjectId] nvarchar(40) NOT NULL,[DefaultSectionName] nvarchar(max) NULL,[Email] nvarchar(80) NOT NULL,[FirstName] nvarchar(60) NULL,[IsBlocked] bit NOT NULL,[LastName] nvarchar(80) NULL,[Prefix] nvarchar(16) NULL,CONSTRAINT [PK_Accounts] PRIMARY KEY ([Id])
);
info: Microsoft.EntityFrameworkCore.Database.Command[20101]
Executed DbCommand (6ms) [Parameters=[],CommandTimeout='30']
CREATE TABLE [Organizations] (
[Id] int NOT NULL IDENTITY,[Name] nvarchar(36) NOT NULL,CONSTRAINT [PK_Organizations] PRIMARY KEY ([Id])
);
info: Microsoft.EntityFrameworkCore.Database.Command[20101]
Executed DbCommand (8ms) [Parameters=[],CommandTimeout='30']
CREATE TABLE [OrganizationMembers] (
[Id] int NOT NULL IDENTITY,[AccountId] int NOT NULL,[IsNew] bit NOT NULL,[OrganizationId] int NOT NULL,[UserName] nvarchar(24) NOT NULL,CONSTRAINT [PK_OrganizationMembers] PRIMARY KEY ([Id]),CONSTRAINT [FK_OrganizationMembers_Accounts_AccountId] FOREIGN KEY ([AccountId]) REFERENCES [Accounts] ([Id]) ON DELETE CASCADE,CONSTRAINT [FK_OrganizationMembers_Organizations_OrganizationId] FOREIGN KEY ([OrganizationId]) REFERENCES [Organizations] ([Id]) ON DELETE CASCADE
);
info: Microsoft.EntityFrameworkCore.Database.Command[20101]
Executed DbCommand (7ms) [Parameters=[],CommandTimeout='30']
CREATE TABLE [Sections] (
[Id] int NOT NULL IDENTITY,[IsLocked] bit NOT NULL,[Name] nvarchar(48) NOT NULL,CONSTRAINT [PK_Sections] PRIMARY KEY ([Id]),CONSTRAINT [FK_Sections_Organizations_OrganizationId] FOREIGN KEY ([OrganizationId]) REFERENCES [Organizations] ([Id]) ON DELETE CASCADE
);
fail: Microsoft.EntityFrameworkCore.Database.Command[20102]
Failed executing DbCommand (35ms) [Parameters=[],CommandTimeout='30']
CREATE TABLE [SectionMembers] (
[Id] int NOT NULL IDENTITY,[AccountLevel] tinyint NOT NULL,[OrganizationMemberId] int NOT NULL,[SectionId] int NOT NULL,CONSTRAINT [PK_SectionMembers] PRIMARY KEY ([Id]),CONSTRAINT [FK_SectionMembers_OrganizationMembers_OrganizationMemberId] FOREIGN KEY ([OrganizationMemberId]) REFERENCES [OrganizationMembers] ([Id]) ON DELETE CASCADE,CONSTRAINT [FK_SectionMembers_Sections_SectionId] FOREIGN KEY ([SectionId]) REFERENCES [Sections] ([Id]) ON DELETE CASCADE
);
Error: Introducing FOREIGN KEY constraint 'FK_SectionMembers_Sections_SectionId' on table 'SectionMembers' may cause cycles or multiple cascade paths. Specify ON DELETE NO ACTION or ON UPDATE NO ACTION,or modify other FOREIGN KEY constraints.
Could not create constraint or index. See prevIoUs errors.
解决方法
- 有多个帐户
- 一个帐户可以是多个组织的成员=> OrganizationMember
- 一个组织有多个部门
- 一个OrganizationMember可以是多个Sections的成员=> SectionMember
该布局如何
- 有N个帐户=>
Account (PK account_id)
- 有N个组织=>
Organization (PK organization_id)
- 一个组织有1..N个部分=>
Section (PK section_id,FK organization_id NOT NULL)
- 一个帐户可以是多个部分的成员=>
AccountSection (PK (FK account_id,FK section_id))
最后,帐户始终是部分的成员,并且仅是隐式组织的成员(无论是否可以通过简单的JOIN确定)。