Wie zu sagen, Entity Framework, dass meine Spalte ID als auto-increment (AspNet-Core 2.0 + PostgreSQL)?
Code ist einfach.
Tag.cs
Person:
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
Klasse:
public async Task<IActionResult> Index()
{
tagRepository.Insert(new Tag
{
Name = "name",
Description = "description"
});
await UnitOfWork.SaveChangesAsync(); //calls dbContext.SaveChangesAsync()
return View();
}
TagRepository.cs
Klasse:
//Context it's a usual DBContext injected via Repository's constructor
public virtual void Insert(TEntity item)
=> Context.Entry(item).State = EntityState.Added;
Tag
Tabelle erstellt wurde, indem Sie Folgendes ausführen:
CREATE TABLE Tag (
ID SERIAL PRIMARY KEY,
Name text NOT NULL,
Description text NULL
);
Wenn meine Anwendung bekomme ich eine Fehlermeldung:
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()
Wie Sie sehen können, Entity Framework zu senden versucht id=0
Wert in die DB, aber es ist bereits ein Datensatz mit id=0
in meine DB und das ist, warum wirft er duplicate key
Fehler.
Ich nicht finden, eine Antwort, so weit und meine Frage ist: wie kann ich loswerden dieser Fehler und sagen, Entity Framework, dass meine id
Spalte auto-increment und es gibt keine Notwendigkeit, Sie zu aktualisieren?
InformationsquelleAutor Andrew Kotov | 2018-05-06
Du musst angemeldet sein, um einen Kommentar abzugeben.
Haben Sie hier zu verwenden "ValueGenerationOnAdd()". Wie die Ausgabe, die Sie bekommen werden, ist bereits berichtet auf GitHub. Finden Sie bitte den folgenden link.
https://github.com/npgsql/Npgsql.EntityFrameworkCore.PostgreSQL/issues/73
Finden Sie mehr info in Bezug auf Generierte Wert-Muster aus dem folgenden link.
Generierte Wert auf hinzufügen
Quelle:- https://www.learnentityframeworkcore.com/configuration/fluent-api/valuegeneratedonadd-method
Hoffe das hilft
Scaffold-DbContext
) und interessante Sache ist, dass alle meineid
Eigenschaften in allen Entitäten generiert wurden, mit.Property(p => p.Id).ValueGeneratedNever()
. Dies könnte ein bug sein, denke ich.. Jedenfalls habe ich ersetzt es mit.ValueGeneratedOnAdd()
und es funktioniert. Danke für die links und Erklärung.InformationsquelleAutor Trilok Kumar