J'utilise d'abord Entity Framework Core 2.0 for Sqlite dans mon UWP et .NET Standard app. Mon modèle a une entité de type clé primaire entière qui doit être utilisée comme incrémentation automatique conformément à Documentation SQLite . Mais en réalité, pour chaque ligne, la colonne Identity reçoit 0 comme valeur. S'il vous plaît, aidez-moi parce que je n'ai trouvé aucun matériel d'aide lié à ce problème.
Ceci est ma propriété sans aucune annotation de données.
public Int32 No { get; set; }
J'ai utilisé des API fluides
modelBuilder.Entity<TurnosGeneral>()
.HasKey(c => new { c.No, c.Cod_Turno });
Et la valeur est insérée ici
db.TurnosGenerals.Add(new TurnosGeneral { Cod_Turno = numeroTurnoTextBlock.Text });
db.SaveChanges();
Pour chaque ligne insérée, c.No vaut 0.
Mon modèle a une entité de type entier de clé primaire qui doit être servie en incrémentation automatique.
Le problème est que la propriété en question est pas une PK, mais une partie d'un composite} PK, auquel cas elle n'est pas considérée comme générée automatiquement par la convention, comme expliqué dans le Conventions de valeurs générées de la documentation d'EF Core:
Par convention, non-composite des clés primaires de type short, int, long ou Guid seront configurées pour que les valeurs soient générées lors de l'ajout. Toutes les autres propriétés seront configurées sans génération de valeur.
Vous devez spécifier cela explicitement:
modelBuilder.Entity<TurnosGeneral>()
.Property(e => e.No)
.ValueGeneratedOnAdd();
Update: Ce qui précède est l'approche générale applicable à la plupart des bases de données. Mais SQLite ne prend en charge AutoIncrement que pour les colonnes de type INTEGER PRIMARY KEY . Il ne s’agit donc pas d’une limitation EF Core. N'utilisez pas l'incrémentation automatique ou faites-en une PK non composite.
On dirait un bug. Vérifiez ceci: https://github.com/aspnet/EntityFrameworkCore/issues/11961
Ma solution de contournement: Modifiez manuellement les colonnes: .ValueGeneratedNever () en .ValueGeneratedOnAdd () on des colonnes Id dans ma classe DBContext.