首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >实体框架-1到1的关系,其中一端不是主键

实体框架-1到1的关系,其中一端不是主键
EN

Stack Overflow用户
提问于 2010-12-19 21:58:04
回答 2查看 2.9K关注 0票数 0

我想在实体框架数据模型中定义一个关系,即1到1,其中一端是一个表的主键,另一端是另一个表上的外键。例如:

代码语言:javascript
运行
复制
table: aspnet_Users
w/ col: UserId guid Primary Key

使用与User表的UserId列相关的aspnet_Users表的AspUserId属性:

代码语言:javascript
运行
复制
table: User
w /col: UserId int Primary Key
w /col: AspUserId guid

当我尝试这样做时,我会收到一个错误,因为AspUserId字段不是它的表中无法工作的主键:

错误21错误113:多重性在关系‘FK_User_aspnet_User’中的角色'User‘中无效。因为依赖角色属性不是关键属性,因此依赖角色的多重性的上限必须是*。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-12-19 22:45:38

外键需要映射到主键。否则,可能会出现以下记录:

代码语言:javascript
运行
复制
aspnet_Users
UserId 
11111111
11111111
22222222

User
UserId AspUserId
1      11111111
2      11111111

这是没有意义的-打破了你的1-1基数。

不过,尽管如此(看看一个旧的成员资格db - yuck),UserId字段在dbo.aspnet_Users上是一个主键。

你确定你的外键在正确的桌子上吗?数据库中的dbo.aspnet_Users是否有UserId的PK。

此外--尽量不要绘制会籍表--这将是一个痛苦的世界。成员架构中的关系非常复杂。

只需映射您自己的用户表即可。数据库端工作(审计、存储过程、触发器等)可以使用FK。

但是从模型方面来说-您应该通过EF与您的用户实体进行交互,通过成员资格提供程序API与您的aspnet_Users (成员资格)实体进行交互。

如果您需要在代码中将它们“缝合在一起”(通常是这种情况),那么将其封装在服务后面。

票数 1
EN

Stack Overflow用户

发布于 2010-12-20 03:16:26

作为对海报的回应,用户表:

代码语言:javascript
运行
复制
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
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4485350

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档