Ciao a tutti,
sto studiando in questi giorni l'utilizzo di EF Core e sto riscontrando dei problemi con un caso particolare in cui una tabella sul database deve gestire una chiave univoca composta da una chiave esterna e un campo. Di seguito un esempio
[Index(nameof(CreationDate))]
[Index(nameof(UserName))]
public class Job
{
public Guid JobID { get; set; }
[Required]
public DateTime CreationDate { get; set; }
[Required]
public string UserName { get; set; } = "";
}
[Index(nameof(Job ), nameof(TargetName), IsUnique = true)]
public class JobActivity
{
public Guid JobActivityID { get; set; }
[Required]
public Job? Job { get; set; } = new Job();
[Required]
public string TargetName { get; set; } = "";
}
Questo pezzettino di codice mi manda in errore il comando da CLI "dotnet ef migration ..." perche il provider non supporta l'istruzione [Index(nameof(Job ), nameof(TargetName), IsUnique = true)] in quanto Job è una classe. Premetto che sto utilizzando un database MySql e come provider EF "Pomelo.EntityFrameworkCore.MySql" che è quello che mi ha dato più soddisfazione con i comandi da CLI.
Io personalmente ho trovato (sfruttando la mia immaginazione :D) la seguente soluzione
[Index(nameof(CreationDate))]
[Index(nameof(UserName))]
public class Job
{
public Guid JobID { get; set; }
[Required]
public DateTime CreationDate { get; set; }
[Required]
public string UserName { get; set; } = "";
}
[Index(nameof(RefJob), nameof(TargetName), IsUnique = true)]
public class JobActivity
{
public Guid JobActivityID { get; set; }
[Required]
public Job? Job { get; set; } = new Job();
[Required]
public Guid? RefJob
{
get => Job?.JobID;
set
{
}
}
[Required]
public string TargetName { get; set; } = "";
}
Il trick quindi è usare un campo "fittizzio" dato a contenere la chiave specificata dalla classe Job. Il codice pare funzionare bene con la classiche operazioni di R/W ma ovviamente ho lo svantaggio di avere due colonne duplicate che in realtà a livello di DB non sono necessarie.
Le domande essenzialmente sono due :
1) I problemi che sto riscontrando sono dovuti esclusivamente al provider che sto utilizzando (Pomelo in questo caso) e ad esempio con quello per SqlServer non avrei lo stesso problema?
2) Esiste una soluzione più elegante per risolvere questo problema?
Ciao :)
Modificato da alfaman il 17 marzo 2022 07:02 -