Автоинкрементный первичный ключ с Entity Framework - PullRequest
1 голос
/ 09 апреля 2020

У меня есть таблица, и я хочу вставить в нее элементы без указания UserID. Я хочу, чтобы этот идентификатор генерировался автоматически.

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();
}

Но я получаю исключение:

Нарушение ограничения PRIMARY KEY 'PK__tmp_ms_x__1788CCACDB8355D2'. Невозможно вставить дубликат ключа в объект 'dbo.UserMaster'. Дубликат значения ключа (0). Заявление было прекращено.

Ответы [ 3 ]

1 голос
/ 09 апреля 2020

Добавьте [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; }
}

Когда вы создаете миграцию и таблицу на основе этой модели, EF создает поле идентификатора с автоматическим приращением.

1 голос
/ 09 апреля 2020

Entity Framework не знает всю вашу базу данных, он знает только те записи, которые вы уже загрузили в свой контекст. Поэтому он не может определить максимально используемый идентификатор в данной таблице.

У вас есть 3 варианта здесь:

Используйте функцию вашей БД для автоматической установки идентификатора, столбец идентификаторов с автоинкрементным увеличением

или

Напишите в вашей базе данных функцию, которая возвращает максимальный идентификатор, и установите ее самостоятельно в EF

или

Получить всю таблицу в EF ( загрузить его полностью), а затем выбрать максимальный идентификатор.

Я настоятельно рекомендую использовать вариант 2 и 3, а вариант 1 - использовать функцию автоматического увеличения вашей базы данных. Вы должны вставить их через EF с идентификатором null, и БД установит идентификатор. Вам необходимо соответствующим образом пометить столбец.

1 голос
/ 09 апреля 2020

Чтобы сделать автоинкремент на уровне базы данных, вы должны включить в DDL IDENTITY: UserID int identity(1,1) not null

(1,1) означает UserID, начнется с 1 и увеличится на 1 для каждого INSERT.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...