Mysql
 sql >> Database >  >> RDS >> Mysql

Come utilizzare i tipi int/long non firmati con Entity Framework?

Aggiornamento febbraio 2021

Apparentemente EF Core ora supporta ulong -- vedi la risposta di @JimbobTheSailor di seguito.

Versioni precedenti di Entity Framework:

Si scopre che Entity Framework non supporta unsigned tipi di dati. Per uint colonne, si potrebbe semplicemente memorizzare il valore in un tipo di dati con segno con un intervallo più ampio (ovvero, un long ). Che dire di ulong colonne? La soluzione comune non ha funzionato per me perché non esiste un tipo di dati firmato supportato da EF che possa contenere un ulong senza traboccare.

Dopo aver riflettuto un po', ho trovato una soluzione semplice a questo problema:archiviare i dati nel long supportato digita e lancialo su ulong quando si accede. Potresti pensare:"Ma aspetta, valore massimo di ulong> valore massimo di long!" Puoi ancora archiviare i byte di un ulong in un long e poi reimpostarlo su ulong quando ne hai bisogno, poiché entrambi hanno 8 byte. Ciò ti 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;
        }
    }
}

Il casting è unchecked per evitare eccezioni di overflow.

Spero che questo aiuti qualcuno.