Как сообщить Entity Framework, что мой столбец идентификаторов автоматически увеличивается (AspNet Core 2.0 + PostgreSQL)? - PullRequest
0 голосов
/ 06 мая 2018

Код прост. Tag.cs сущность:

public partial class Tag
{
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int Id { get; set; }
    public string Name { get; set; }
    public string Description { get; set; }
}

HomeController.cs класс:

public async Task<IActionResult> Index()
{
   tagRepository.Insert(new Tag 
               { 
                   Name = "name", 
                   Description = "description" 
               });
   await UnitOfWork.SaveChangesAsync();  // calls dbContext.SaveChangesAsync()

   return View();
}

TagRepository.cs класс:

    // Context it's a usual DBContext injected via Repository's constructor
    public virtual void Insert(TEntity item)
                => Context.Entry(item).State = EntityState.Added;

Tag таблица была создана с помощью команды:

CREATE TABLE Tag (
    ID SERIAL PRIMARY KEY,
    Name text NOT NULL,
    Description text NULL
);

При запуске приложения выдается ошибка:

fail: Microsoft.EntityFrameworkCore.Database.Command[20102]
      Failed executing DbCommand (28ms) [Parameters=[@p0='?', @p1='?', @p2='?'], CommandType='Text', CommandTimeout='30']
      INSERT INTO "tag" ("id", "description", "name")
      VALUES (@p0, @p1, @p2);
Npgsql.PostgresException (0x80004005): 23505: duplicate key value violates unique constraint "tag_pkey"
   at Npgsql.NpgsqlConnector.<DoReadMessage>d__157.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
   at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter`1.GetResult()
   at System.Runtime.CompilerServices.ValueTaskAwaiter`1.GetResult()
   at Npgsql.NpgsqlConnector.<ReadMessage>d__156.MoveNext()

Как видите, Entity Framework пытается отправить значение id=0 в БД, но в моей базе уже есть запись с id=0, поэтому она выдает duplicate key ошибку.

Пока я не нашел ответа, и мой вопрос: как я могу избавиться от этой ошибки и сказать Entity Framework, что мой столбец id автоматически увеличивается и нет необходимости его обновлять?

1 Ответ

0 голосов
/ 06 мая 2018

Вы должны использовать здесь "ValueGenerationOnAdd ()" . Как проблема, которую вы получаете, уже сообщается на GitHub. Пожалуйста, найдите ссылку ниже.

https://github.com/npgsql/Npgsql.EntityFrameworkCore.PostgreSQL/issues/73

Дополнительную информацию о шаблоне «Генерируемое значение» можно найти по следующей ссылке.

Значение, генерируемое при добавлении

public classs SampleContext:DBContext{
public DbSet<Tag> Tag { get; set; }

protected override void OnModelCreating(ModelBuilder modelBuilder){
    modelBuilder.Entity<Tag>()
        .Property(p => p.ID)
        .ValueGeneratedOnAdd();
 }
public class Tag{
  public int Id { get; set; }
  public string Name { get; set; }
  public string Description{get;set;}
  }
}

Источник: - https://www.learnentityframeworkcore.com/configuration/fluent-api/valuegeneratedonadd-method

Надеюсь, это поможет

...