Sto usando un modello su cui non ho alcun controllo, di cui sto salvando le istanze in un database SQL.
Sto utilizzando Fluent API per aggiungere una chiave primaria a un attributo in questo modello
modelBuilder.Entity<Message>().HasKey(d => d.DocumentId);
Message
è simile a questo:
[Required]
public Guid DocumentId { get; set; }
[Required]
public int Size { get; set; }
public string SenderId { get; set; }
Tuttavia è completamente possibile ricevere due Message
con lo stesso DocumentId
. Normalmente avrei aggiunto SQL un identificatore univoco quando salvavo usando qualcosa come [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
, ma dal momento che non ho il controllo del Message
, come gestirlo?
Ogni suggerimento è molto apprezzato.
Fortunatamente EF Core ti consente di definire e utilizzare la proprietà Shadow come PK.
Ad esempio, la seguente configurazione fluente creerà la colonna Identity denominata "Id" e la userà come PK:
modelBuilder.Entity<Message>()
.Property<int>("Id")
.ValueGeneratedOnAdd();
modelBuilder.Entity<Message>()
.HasKey("Id");
ValueGeneratedOnAdd
e HasKey
in questo caso sono ridondanti, perché la proprietà denominata "Id" per convenzione è PK e int
tipo PK per convenzione vengono generati automaticamente, ma li ho aggiunti per completezza.
Ma tieni presente che lavorare con l'ombra PK sarà più difficile. L'aggiunta è facile, ma leggere, aggiornare e cancellare le operazioni sarà problematico. EF.Property
metodo EF.Property
può essere utilizzato all'interno delle query LINQ per fare riferimento al PK shadow, ma in generale sono necessari alcuni criteri secondari nel caso in cui si desideri aggiornare o eliminare un record.