实体框架 - 一对一关系,其中一端不是主键

时间:2010-12-19 21:58:04

标签: .net linq entity-framework entity-framework-4

我想在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的多重性的上限必须为*。

2 个答案:

答案 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