簡體   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