複合主キーを持つテーブルに 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:通常の非複合主キーを持つテーブル間に他の外部キーを作成するコードがあり、そのコードはエラーなしで機能します)。
追加情報で編集: OK. 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 の結果にはありません。ですから、少なくともどの方向から検索を開始すればよいかはわかっています。