我想创建一个具有复合主键的表的DbSyncForeignKeyConstraint,但是,我不断收到错误。下面是一些示例代码,以证明我在做什么:如何创建一个具有复合主键的表的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));
上面的代码会产生这样的错误:
The definition of referring columns (such as number of columns or data types) in referential relationships must match the referred columns.
如果我用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”的结果,我看到“LoweredUserName”被列为PKColumns列“的applicationID”和和UserId列在NonPkColumns中。我不知道是什么导致了这一点。但是,至少我明白为什么错误告诉我列“UserId”不在主键中。它在数据库中,但它不在GetScopDescription的结果中。所以,至少我知道开始搜索的方向。
感谢编辑...我不知道为什么代码没有正确格式化。我多次尝试使它看起来不错。 – rogdawg