首页 文章

如何引用不引用主键列的外键 . Asp.net mvc代码第一?

提问于
浏览
1

我已将其中一个列(不是主键)的引用作为另一个表中的外键引用 . 但我不确定如何在实体框架中处理它 . 我有一个特定的原因,我不能将我的主键用作参考表中的外键列 .

public class Users : IUser
{
    [Key]
    [StringLength(64)]
    [Column("USERID")]
    public string USERID { get; set; }

    [StringLength(128)]
    public string NAME { get; set; }
    [Column("PASSWORD")]
    [MaxLength(64)]
    public byte[] PASSWORD { get; set; }

    [StringLength(2)]
    public string STATUS { get; set; }

    [Column("UserIdentifierId")]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int UserId { get; set; }
}

public class RolesUsers
{
    [Key]
    public int RolesUsersId { get; set; }
    public int UserId { get; set; }
    public int RoleId { get; set; }
    [ForeignKey("UserId")]
    public virtual Users User { get; set; }
    [ForeignKey("RoleId")]
    public virtual Roles Role { get; set; }
}

正如你所看到的 UserIdentifierId 是我的列,我在 RolesUsers 表中为 UserId 配置了参考(在SQL _2966129中是唯一的约束,它对参考有效)

我现在得到以下错误:

在模型生成期间检测到一个或多个验证错误:RolesUsers_User_Target_RolesUsers_User_Source ::参照约束的从属角色中的所有属性的类型必须与主体角色中的相应属性类型相同 . 实体'RolesUsers'上的属性'UserId'的类型与参照约束'RolesUsers_User'中实体'Users'上的属性'USERID'不匹配 .

SQL结构:

CREATE TABLE [dbo].[ATQ_USERS]
(
    [USERID] [varchar](64) NOT NULL,
    [NAME] [varchar](128) NULL,
    [PASSWORD] [varbinary](64) NULL,
    [STATUS] [char](2) NULL,
    [UserIdentifierId] [int] IDENTITY(1,1) NOT NULL,

    CONSTRAINT [PK_ATQ_USERS] 
        PRIMARY KEY CLUSTERED ([USERID] ASC)) ON [PRIMARY],
    CONSTRAINT [Uk_UserIdentifierId] 
        UNIQUE NONCLUSTERED ([UserIdentifierId] ASC)) ON [PRIMARY]
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]

CREATE TABLE [dbo].[Roles]
(
    [Id] [int] IDENTITY(1,1) NOT NULL,
    [Name] [nvarchar](200) NULL,
    [IsActive] [bit] NOT NULL,
    [CreatedOnUTC] [datetime] NULL,
    [UpdatedOnUTC] [datetime] NULL,
    [DeletedOnUTC] [datetime] NULL,
    [IsDeleted] [bit] NOT NULL,
    [Text] [varchar](50) NULL,

    CONSTRAINT [PK_dbo.Roles] 
        PRIMARY KEY CLUSTERED ([Id] ASC)
) ON [PRIMARY]

CREATE TABLE [dbo].[RolesUsers]
(
    [RolesUsersId] [int] IDENTITY(1,1) NOT NULL,
    [RoleId] [int] NULL,
    [UserId] [int] NULL,

    PRIMARY KEY CLUSTERED ([RolesUsersId] ASC)
) ON [PRIMARY]

GO
ALTER TABLE [dbo].[RolesUsers] WITH CHECK 
    ADD FOREIGN KEY([RoleId]) REFERENCES [dbo].[Roles] ([Id])
GO

ALTER TABLE [dbo].[RolesUsers] WITH CHECK 
    ADD FOREIGN KEY([UserId]) REFERENCES [dbo].[ATQ_USERS] ([UserIdentifierId])

1 回答

  • 1

    没问题 . 只需将UserIdentifierId声明为实体Key即可 . 关于在数据库中将哪个键声明为PK,没有什么不可思议的 . 您的实体可以使用任何唯一索引作为密钥 .

相关问题