Incrémentation automatique sur une clé primaire partielle avec Entity Framework Core

asp.net c# entity-framework entity-framework-core postgresql

Question

J'ai déclaré le modèle suivant à l'aide de l'API EF Core fluent:

modelBuilder.Entity<Foo>()
    .HasKey(p => new { p.Name, p.Id });

Les deux champs sont marqués comme clé primaire lorsque je crée la base de données dans PostgreSQL, mais le champ Id n'est pas marqué comme incrémentation automatique. J'ai aussi essayé d'ajouter

[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]

dans le champ Id sous Foo sans que cela fasse une différence sur le code de migration. Y at-il un moyen de faire l'ID AI même si c'est un PPK?

Réponse acceptée

Eh bien, ces annotations de données devraient faire l'affaire, peut-être est-il lié au fournisseur PostgreSQL.

À partir de la documentation EF Core :

Selon le fournisseur de base de données utilisé, des valeurs peuvent être générées côté client par EF ou dans la base de données. Si la valeur est générée par la base de données, EF peut affecter une valeur temporaire lorsque vous ajoutez l'entité au contexte. Cette valeur temporaire sera alors remplacée par la valeur générée par la base de données lors de SaveChanges .

Vous pouvez également essayer avec cette configuration Fluent Api:

modelBuilder.Entity<Foo>()
            .Property(f => f.Id)
            .ValueGeneratedOnAdd();

Mais comme je l’ai dit plus tôt, je pense que cela est lié au fournisseur de base de données. Essayez d’ajouter une nouvelle ligne à votre base de données et de vérifier ultérieurement si une valeur a été générée pour la colonne Id .


Réponse populaire

Tout d’abord, vous ne devriez pas fusionner l’API Fluent avec l’annotation de données, je vous suggère donc d’utiliser l’un des éléments suivants:

assurez-vous d'avoir correctement réglé les clés

modelBuilder.Entity<Foo>()
            .HasKey(p => new { p.Name, p.Id });
modelBuilder.Entity<Foo>().Property(p => p.Id).HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);

OU vous pouvez le réaliser en utilisant également des annotations de données

public class Foo
{
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    [Key, Column(Order = 0)]
    public int Id { get; set; }

    [Key, Column(Order = 1)]
    public string Name{ get; set; }
}


Related

Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow