我想在Entity Framework数据模型中定义一对一的关系,其中一端作为一个表的主键,另一端作为另一个表的外键。例如:
table: aspnet_Users
w/ col: UserId guid Primary Key
使用与User表的AspUserId列相关的aspnet_Users表的UserId属性:
table: User
w /col: UserId int Primary Key
w /col: AspUserId guid
当我尝试这样做时,我收到一条错误消息,因为AspUserId字段不是它的表的主键,不起作用:
错误21错误113:多重性在关系'FK_User_aspnet_Users'中的角色'用户'中无效。由于Dependent Role属性不是关键属性,因此Dependent Role的多重性的上限必须为*。
答案 0 :(得分:1)
外键需要映射到主键。否则,可能会发生以下记录:
aspnet_Users
UserId
11111111
11111111
22222222
User
UserId AspUserId
1 11111111
2 11111111
这没有意义 - 打破你的1-1基数。
但是 - 正如所说的那样(查看旧会员数据库 - yuck),UserId
上的dbo.aspnet_Users
字段是主键。
您确定在正确的桌子上有外键吗?您的数据库上的dbo.aspnet_Users
是否具有UserId
的PK。
另外 - 尽量不映射会员表 - 这将是一个痛苦的世界。成员资格模式中的关系非常复杂。
只需映射您自己的用户表。将FK用于数据库端工作(审计,存储过程,触发器等)是可以的。
但是从模型方面 - 您应该通过EF与您的用户实体进行交互,并通过成员资格提供程序API与您的aspnet_Users(成员资格)实体进行交互。
如果您需要在代码中“将它们拼接在一起”(通常是这种情况),请将其封装在服务后面。
答案 1 :(得分:0)
回复用户表格的海报:
CREATE TABLE [dbo].[User](
[UserId] [int] IDENTITY(1,1) NOT NULL,
[AspUserId] [uniqueidentifier] NOT NULL,
[ModifiedDate] [datetime] NOT NULL,
[CreatedDate] [datetime] NOT NULL,
CONSTRAINT [PK_User] 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]
GO
ALTER TABLE [dbo].[User] WITH CHECK ADD CONSTRAINT [FK_User_aspnet_Users] FOREIGN KEY([AspUserId])
REFERENCES [dbo].[aspnet_Users] ([UserId])
GO
ALTER TABLE [dbo].[User] CHECK CONSTRAINT [FK_User_aspnet_Users]
GO