#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;}