Le proprietà della classe con il tipo di dati long
vengono mappate correttamente quando si aggiunge una nuova migrazione (prima del codice), ma ulong
tipi di dati vengono ignorati dal provider EF di mysql. Come si fa a mappare una proprietà per usare il unsigned bigint
di mysql?
Si scopre che Entity Framework non supporta i tipi di dati non unsigned
. Per le colonne uint
, è possibile solo memorizzare il valore in un tipo di dati firmato con un intervallo più ampio (ovvero long
). Che dire ulong
colonne ulong
? La soluzione comune potrebbe non funzionare per me perché non esiste un tipo di dati firmato supportato da EF che possa contenere un ulong
senza traboccare.
Dopo un po 'di riflessione, ho trovato una soluzione semplice a questo problema: è sufficiente memorizzare i dati nel tipo long
supportato e ulong
a ulong
quando si accede. Potresti pensare: "Ma aspetta, il valore massimo di ulong> il valore massimo di long!" È ancora possibile memorizzare i byte di un ulong in un lungo e quindi restituirlo a ulong quando ne hai bisogno, dal momento che entrambi hanno 8 byte. Ciò consentirà di salvare una variabile ulong in un database tramite EF.
// Avoid modifying the following directly.
// Used as a database column only.
public long __MyVariable { get; set; }
// Access/modify this variable instead.
// Tell EF not to map this field to a Db table
[NotMapped]
public ulong MyVariable
{
get
{
unchecked
{
return (ulong)__MyVariable;
}
}
set
{
unchecked
{
__MyVariable = (long)value;
}
}
}
La trasmissione è unchecked
per impedire eccezioni di overflow.
Spero che questo aiuti qualcuno.