我正在尝试为具有复合主键的表创建 DbSyncForeignKeyConstraint,但是我不断收到错误消息。这是一些示例代码来演示我在做什么:
示例表:
USE [TempTest]
GO
CREATE TABLE [dbo].[Users](
[UserId] [uniqueidentifier] NOT NULL,
CONSTRAINT [PK_Users] PRIMARY KEY CLUSTERED
(
[UserId] ASC
)
WITH
(
PAD_INDEX = OFF,
STATISTICS_NORECOMPUTE = OFF,
IGNORE_DUP_KEY = OFF,
ALLOW_ROW_LOCKS = ON,
ALLOW_PAGE_LOCKS = ON
) ON [PRIMARY]
) ON [PRIMARY]
CREATE TABLE [dbo].[UsersRoles](
[UserId] [uniqueidentifier] NOT NULL,
[RoleId] [uniqueidentifier] NOT NULL,
CONSTRAINT [PK_UsersRoles] PRIMARY KEY CLUSTERED
(
[UserId] ASC,
[RoleId] ASC
)
WITH
(
PAD_INDEX = OFF,
STATISTICS_NORECOMPUTE = OFF,
IGNORE_DUP_KEY = OFF,
ALLOW_ROW_LOCKS = ON,
ALLOW_PAGE_LOCKS = ON
) ON [PRIMARY]
) ON [PRIMARY]
GO
这是我的 C# 代码:
DbSyncTableDescription tableDesc = SqlSyncDescriptionBuilder.GetDescriptionForTable("UsersRoles", (SqlConnection)this.dbProvider.Connection);
Collection<string> parentkeys = new Collection<string>();
parentkeys.Add("UserId");
Collection<string> childkeys = new Collection<string>();
childkeys.Add("RoleId");
childkeys.Add("UserId");
tableDesc.Constraints.Add(new DbSyncForeignKeyConstraint("FK_UsersRoles_Users", "Users", "UsersRoles", parentkeys, childkeys));
上面的代码会产生这个错误:
引用关系中引用列的定义(如列数或数据类型)必须与引用列匹配。
如果我用 注释掉该行childkeys.Add("RoleId")
,则会收到此错误:“引用的表必须具有主键或候选键。”
所以我有点不清楚我应该如何做到这一点。在此示例中,约束实际上应该仅与 UserId 列有关。但是,由于 UsersRoles 表有一个复合主键,我应该在约束中包含它吗?如果我在约束定义中遗漏了“RoleId”,我会得到一个错误......如果我包含它,我会得到一个不同的错误。
有人对我应该如何进行有任何建议吗?(PS:我的代码可以在具有普通非复合主键的表之间创建其他外键,并且该代码可以正常工作)。
编辑附加信息:好的。问题似乎与 DBSyncForeignKeyConstraint 创建无关。问题似乎与 GetDescriptionForTable 功能有关。它似乎没有将 UserId 作为主键。在我的项目中,我实际上正在使用一个使用 aspnet_Membership 模式的数据库。因此,如果我编写 aspnet_Users 表的脚本,它看起来像这样:
'
CREATE TABLE [dbo].[aspnet_Users](
[ApplicationId] [uniqueidentifier] NOT NULL,
[UserId] [uniqueidentifier] NOT NULL,
[UserName] nvarchar NOT NULL,
[LoweredUserName] nvarchar NOT NULL,
[MobileAlias] nvarchar NULL,
[IsAnonymous] [bit] NOT NULL,
[LastActivityDate] [datetime] NOT NULL,
PRIMARY KEY NONCLUSTERED
(
[UserId] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
ALTER TABLE [dbo].[aspnet_Users] WITH CHECK ADD FOREIGN KEY([ApplicationId])
REFERENCES [dbo].[aspnet_Applications] ([ApplicationId])
GO
ALTER TABLE [dbo].[aspnet_Users] ADD DEFAULT (newid()) FOR [UserId]
GO
ALTER TABLE [dbo].[aspnet_Users] ADD DEFAULT (NULL) FOR [MobileAlias]
GO
ALTER TABLE [dbo] [aspnet_Users] ADD DEFAULT ((0)) FOR [IsAnonymous] GO'
但是,如果我检查调用“GetScopeDescription”的结果,我会看到列“ApplicationId”和“LoweredUserName”列为 PKColumns,而 UserId 列在 NonPkColumns 中。我不知道是什么原因造成的。但是,至少我明白为什么错误告诉我“UserId”列不在主键中。它在数据库中,但在 GetScopDescription 的结果中不存在。所以,我至少知道从哪个方向开始搜索。