복합 기본 키가있는 테이블에 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 테이블, 그것은 다음과 같습니다, 내가보고 내가 "GetScopeDescription"을 호출의 결과를 살펴보면, ' 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'
을하지만 "LoweredUserName는"PKColumns로 표시되는 열 "애플리케이션 ID"및 및 그 UserId는 NonPkColumns 중에 나열됩니다. 나는 이것이 무엇을 일으키는 지 전혀 모른다. 그러나 적어도 "UserId"열이 기본 키 사이에 없다는 오류가 나오는 이유를 이해합니다. 데이터베이스에 있지만 GetScopDescription의 결과에는 없습니다. 그래서 나는 최소한 검색을 시작하는 방향을 알고 있습니다.
덕분에 ... 나는 코드가 제대로 포맷하지 않았는지 모르겠습니다. 나는 그것을보기 좋게하기 위해 여러 번 노력했다. – rogdawg