Le code est simple. Tag.cs
entité:
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
classe:
public async Task<IActionResult> Index()
{
tagRepository.Insert(new Tag
{
Name = "name",
Description = "description"
});
await UnitOfWork.SaveChangesAsync(); // calls dbContext.SaveChangesAsync()
return View();
}
TagRepository.cs
classe:
// Context it's a usual DBContext injected via Repository's constructor
public virtual void Insert(TEntity item)
=> Context.Entry(item).State = EntityState.Added;
Tag
table a été créée en exécutant:
CREATE TABLE Tag (
ID SERIAL PRIMARY KEY,
Name text NOT NULL,
Description text NULL
);
Lorsque j'exécute mon application, j'obtiens une erreur:
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()
Comme vous pouvez le voir, Entity Framework essaie d'envoyer id=0
valeur dans la base de données, mais il existe déjà un enregistrement avec id=0
dans ma base de données et c'est pourquoi il jette duplicate key
Erreur.
Je n'ai trouvé aucune réponse jusqu'à présent et ma question est: comment puis-je me débarrasser de cette erreur et dire à Entity Framework que ma colonne id
est auto-incrémentée et qu'il n'est pas nécessaire de la mettre à jour?
Vous devez utiliser ici "ValueGenerationOnAdd ()" . Comme le problème que vous rencontrez est déjà signalé sur GitHub. Veuillez trouver le lien ci-dessous.
https://github.com/npgsql/Npgsql.EntityFrameworkCore.PostgreSQL/issues/7
Vous pouvez trouver plus d'informations concernant le modèle de valeur générée à partir du lien suivant.
Valeur générée lors de l'ajout
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;}
}
}
Source: - https://www.learnentityframeworkcore.com/configuration/fluent-api/valuegeneratedonadd-method
J'espère que cela vous aidera