Не удается получить последний вставленный идентификатор EF core 2.2

#c# #entity-framework #ef-code-first #ef-core-2.2

#c# #entity-framework #ef-code-first #ef-core-2.2

Вопрос:

Хотя я понимаю, что в Интернете есть много статей об этом, я, похоже, не могу найти решение своей проблемы. Одна из причин заключается в том, что во всех статьях, которые я нашел, не используется функция async. Вот моя проблема:

У меня есть объект:

 [Key]
public int Id { get; set; }
[Required]
public string Name { get; set; }
[Url]
public string LogoUrl { get; set; }
[Required]
public string AdministratorIdentityId { get; set; }
public string Verified { get; set; }
public int AddressId { get; set; }
  

В контексте моей базы данных у меня есть следующее:

 protected override void OnModelCreating(ModelBuilder model)
{
        model.Entity<RestaurantEntity>()
            .Property(p => p.Id)
            .ValueGeneratedNever();

        base.OnModelCreating(model);
}
  

И мой код для сохранения информации в базе данных таков:

 try
{
    RestaurantEntity dbrestaurant = new RestaurantEntity();
    dbrestaurant.Name = restaurantName;
    dbrestaurant.AdministratorIdentityId = restaurantAdministrator;
    dbrestaurant.Verified = GenerateVerifiedCode();

    await _appDbContext.Restaurants.AddAsync(dbrestaurant);
    await _appDbContext.SaveChangesAsync();

    int newpk = dbrestaurant.Id;

    return newpk;
}
  

Моя проблема в том, что newpk ВСЕГДА равен 0, в то время как в DB генерируется правильное значение. По какой-то причине EF core не извлекает вставленное значение.

Это код, извлекающий информацию:

введите описание изображения здесь

Это значение DB:

введите описание изображения здесь

Комментарии:

1. почему вы используете «ValueGeneratedNever();» при «Создании модели»?

2. Сначала я читал в Интернете, что моя проблема заключалась в том, что объект получал значение 0, поэтому я должен использовать это, чтобы убедиться, что 0 не сгенерирован, хотя все еще генерирует 0 для нового идентификатора объекта, вот почему он у меня есть.

3. Вы понимаете это model.Entity<RestaurantEntity>() .Property(p => p.Id) .ValueGeneratedNever(); ?

4. С .ValueGeneratedNever() вы говорите «Привет, мистер. EntityFramework! Я сам займусь генерацией ключа объекта. Пожалуйста, не устанавливайте его и не считывайте из базы данных сразу после вставки этого объекта.» Чего вы ожидаете?

5. я думаю, мораль этой истории заключается в том, чтобы прочитать документацию и просто не использовать чужой код и ответы, если вы не понимаете их полностью и по-настоящему не отладили и не определили свою проблему

Ответ №1:

Изменить,

 [Key]
public int Id { get; set; }
  

Для

 [Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int Id {get;set;}