Ho diverse classi in EF Core 2. 1) Classe Ser
2) Classe SerStaHis
ha SerId come tipo Guid. È una chiave esterna per Class Ser. È una chiave primaria con data e ora
ha il timestamp. È una chiave primaria con SerId
Uso EF Core 2 per creare due tabelle sopra. Ho usato la funzione Chiave composita per combinare SerStaHis.timestamp e SerStaHis.SerId come chiave primaria.
Uso anche l'attributo ForeignKey in Class Ser. Il problema è che sono riuscito a mappare la chiave esterna su Class SerStaHis, ma non sono riuscito a combinare quella chiave esterna con SerStaHis.timestamp come chiave primaria.
Ecco i frammenti di codice per il metodo Class Ser, Class SerStaHis e OnModelCreating.
public class Ser {
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)] // auto-incrementing feature
public Guid id { get; set; }
//nav/foreign keys
[ForeignKey("id")]
public virtual ICollection<SerStaHis> SerStaHis{ get; set; }
}
public class SerStaHis{
[Required] // maybe this is wrong as I got a foreign key from Class Ser
public Guid service_id { get; set; }
[Required]
public DateTime timestamp { get; set; }
}
protected override void OnModelCreating(ModelBuilder modelBuilder) {
base.OnModelCreating(modelBuilder);
// composite primary keys method. // https://docs.microsoft.com/en-us/ef/core/modeling/keys
modelBuilder.Entity<SerStaHis>()
.HasKey(c => new {c.service_id, c.timestamp});
}
Ecco il risultato effettivo che ho ottenuto quando eseguo la migrazione a SQL:
(fonte: pbrd.co )
Il mio risultato atteso in SQL è il seguente:
(fonte: pbrd.co )
Per favore fatemi sapere se avete bisogno di ulteriori chiarimenti.
Posso eseguire l'attività sopra descritta con il metodo FluentAPI?
Come si usa la chiave esterna come chiave primaria composita?
Grazie
Modificare
[ForeignKey("id")]
public virtual ICollection<SerStaHis> SerStaHis{ get; set; }
a
[ForeignKey("service_id")]
public virtual ICollection<SerStaHis> SerStaHis{ get; set; }
ForeignKey
attributo ForeignKey
funziona in modo diverso quando applicato sulla proprietà FK, sulla proprietà di navigazione di riferimento e sulla proprietà di navigazione della raccolta. Quando viene applicato sulla proprietà di navigazione della raccolta, specifica il nome della proprietà FK dell'oggetto correlato .
Personalmente trovo ForeignKey
attributo ForeignKey
confuso e soggetto a errori. L'API Fluent è molto più intuitiva e offre un controllo molto migliore. La fluente configurazione per il tuo scenario è come questa:
modelBuilder.Entity<Ser>()
.HasMany(ser => ser.SerStaHis) // collection navigation property
.WithOne() // no reference navigation property
.HasForeignKey(serStaHis => serStaHis.service_id); // foreign key property