Ho lottato con la modifica dei valori in un database per una settimana e non riesco a scoprire cosa sto facendo male. Sono riuscito a creare tabelle, aggiungere ed eliminare entità ma non posso modificare un valore all'interno di un'entità.
L'errore che ottengo è: La proprietà 'Rating' sul tipo di entità 'Generation' è parte di una chiave e quindi non può essere modificata o contrassegnata come modificata. Per cambiare il principio di un'entità esistente con una chiave esterna identificativa, prima cancella il dipendente e invoca "SaveChanges", quindi associa il dipendente al nuovo principale.
(Non sono abituato al termine principal ma penso che sia l'entità che ha la chiave univoca.Non ho usato il termine dipendente in un contesto di database ma penso che sia l'entità in un'altra tabella che ha un link a il principale )
A proposito: sto usando Microsoft.AspNetCore.All 2.0.0, Microsoft.EntityFrameworkCore 2.0.0 e Npgsql.EntityFrameworkCore.PostgreSQL 2.0.0
Sono sicuro che questo messaggio di errore cerca di dirmi la soluzione, ma per quanto ne so non c'è nulla che dipenda dal Rating e non è una chiave. Per il contesto qui ci sono le due classi che sto usando per le tabelle nel database:
[Table("Generation")]
public class Generation
{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int GenerationId { get; set; }
[Required]
[MaxLength(100)]
public string DNA { get; set; }
//[Editable(true)]
public double Rating { get; set; }
public Generation(int ID, string dna, double rate)
{
GenerationId = ID;
DNA = dna;
Rating = rate;
}
public Generation()
{
}
}
[Table("Device")]
public class Device
{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int DeviceID { get; set; }
//[Required]
[MaxLength(100)]
public string Identifier { get; set; }
//[ForeignKey("GenerationId2")] <-- should be changed to GenerationId in the near future
public int GenerationId2 { get; set; }
public float WaitingSeconds { get; set; }
}
(È un database che voglio tenere su un server per algoritmi genetici)
Il codice che uso per modificare i dati è abbastanza semplice ma causa l'errore su SaveChanges ():
Generation gen = Program.Context.Generation.FirstOrDefault(g => g.Rating < 0.0);
if (gen != null)
{
gen.Rating = 10.0;
Debug.Log("DNA: About to save changes");
Program.Context.SaveChanges();
}
(Le generazioni sono create con una valutazione negativa per indicare che quel DNA non è stato ancora testato)
Ho sperimentato diverse annotazioni di dati come [Editable (true)], [Required] e [ForeignKey] <- che suppongo lo tenga dipendente dal principal da un'altra classe / tabella.
Qualcuno potrebbe aiutarmi a "semplicemente" modificare alcuni dati in una tabella?
Cordiali saluti!
Cambesa
Nel mio metodo OnModelCreating stavo usando HasKey che cambiava tutto in chiavi primarie.
Sostituendo:
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<Generation>().HasKey(g => new { { g.DNA, g.GenerationId, g.Rating } });
}
con:
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<Generation>().HasKey(g => new { g.GenerationId });
}
Segna solo l'id di generazione come chiave primaria, le altre variabili sono ora modificabili.
Grazie Ivan Stoev