繁体   English   中英

使用实体框架自动增加主键

[英]Auto increment primary key with Entity Framework

我有一个表,我想在不指定UserID的情况下将项目插入其中。 我希望自动生成此 ID。

CREATE TABLE [dbo].[UserMaster] 
(
    [UserID]       INT           NOT NULL ,
    [UserName]     VARCHAR (50)  NULL,
    [UserPassword] VARCHAR (50)  NULL,
    [UserRoles]    VARCHAR (500) NULL,
    [UserEmailID]  VARCHAR (100) NULL,

    PRIMARY KEY CLUSTERED ([UserID] ASC)
);

在这里,我尝试通过 C# 插入行:

using (LessonesDBEntities context = new LessonesDBEntities())
{
    var u = new UserMaster//Make sure you have a table called UserMaster in DB
    {
        UserName = "test username",
        UserPassword = "test password",
        UserEmailID = "test email",
        UserRoles = "User"
    };

    context.UserMaster.Add(u);
    context.SaveChanges();
}

但我得到例外:

违反主键约束“PK__tmp_ms_x__1788CCACDB8355D2”。 无法在 object 'dbo.UserMaster' 中插入重复密钥。 重复键值为 (0)。 该语句已终止。

要在数据库级别进行自动增量,您应该在 DDL 中包含IDENTITYUserID int identity(1,1) not null

(1,1)代表UserID将从1开始,并为每个INSERT递增 1。

[DatabaseGenerated(DatabaseGeneratedOption.Identity)]属性添加到您的身份字段UserId

public class UserMaster
{
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int UserId { get; set; }
    public string UserName { get; set; }
    public string UserPassword { get; set; }

    public string UserEmailID { get; set; }
    public string UserRoles { get; set; }
}

当您基于该 model 创建迁移和表时,EF 创建具有自动增量的标识字段。

Entity Framework 不知道你的整个数据库,它只知道你已经提取到它的上下文中的记录。 因此它无法确定给定表中使用的最大 id。

您在这里有 3 个选项:

使用你的数据库的一个特性来自动设置 id,一个自动递增的标识列

或者

在您的数据库中编写一个 function 返回最大 id 并在 EF 中自行设置

或者

在您的 EF 中获取整个表(完全加载),然后 select 获取最大 ID。

我强烈建议不要使用选项 2 和 3,建议选项 1 使用数据库的自动增量功能。 您应该通过 EF 插入它们,id 为null ,DB 将设置 id。 您需要相应地标记该列。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM