【问题标题】:Entity Framework - 1 to 1 relationship where one end is not a primary key实体框架 - 一端不是主键的 1 对 1 关系
【发布时间】:2010-12-19 21:58:04
【问题描述】:

我想在 Entity Framework 数据模型中定义一种关系,它是一对一的关系,一端作为一个表的主键,另一端作为另​​一个表的外键。例如:

table: aspnet_Users
w/ col: UserId guid Primary Key

用 aspnet_Users 表的 UserId 属性关联到 User 表的 AspUserId 列:

table: User
w /col: UserId int Primary Key
w /col: AspUserId guid

当我尝试这样做时,我收到一条错误消息,指出由于 AspUserId 字段不是它的表的主键,因此不起作用:

错误 21 错误 113:多重性在关系“FK_User_aspnet_Users”中的角色“用户”中无效。因为从属角色属性不是关键属性,所以从属角色的多重性的上限必须是*。

【问题讨论】:

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


    【解决方案1】:

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

    aspnet_Users
    UserId 
    11111111
    11111111
    22222222
    
    User
    UserId AspUserId
    1      11111111
    2      11111111
    

    这没有意义 - 并且会破坏您的 1-1 基数。

    但是 - 话虽这么说(查看旧的会员数据库 - 糟糕),dbo.aspnet_Users 上的 UserId 字段主键。

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

    另外 - 尽量不要映射成员表 - 这将是一个痛苦的世界。成员模式中的关系非常复杂

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

    但是从模型方面 - 您应该通过 EF 与您的 User 实体进行交互,并通过 Membership Provider API 与您的 aspnet_Users (Membership) 实体进行交互。

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

    【讨论】:

    • 是的,确实 aspnet_Users 上的 UserId 字段是主键,我似乎遇到的问题是 AspNetUserId 字段,它不是它的表的 PK:用户。如果我可以回去重新做一遍,我想我可以将用户表的 PK 设置为 guid 并匹配 aspnet_Users 表的 UserId 字段,我不确定这是否值得改变但我认为它会解决我的一对一 EF 模型关系问题。我想我希望会有其他一些解决方法。
    • @BrooklynDev - AspNetUserId 字段不需要是 User 表的 PK。是外键。外键映射到另一个表上的 PK。您确定您在 User 表上而不是在 aspnet_Users 表上创建了 FK 吗?你能显示 Users 表的 CREATE TABLE 语句吗?
    • 是的,我确定 AspUserId 是一个 FK,我的问题似乎是 EF 希望该外键也成为它的表的主键,如果它允许我定义一个 1-to与它的-1关系:在下面添加创建表:
    • 啊,好吧——也许它也需要AspUserId 作为User 上的PK。尝试删除UserId 列并将AspUserId 设置为PK/FK。正如我所说,如果您甚至设法让您的模型与那里的成员资格表一起验证,我会感到惊讶。我仍然建议使用提供者 API。但这是你的决定。
    【解决方案2】:

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

    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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-09-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多