sql >> Base de Datos >  >> RDS >> Mysql

¿Cómo usar tipos int/long sin firmar con Entity Framework?

Actualización de febrero de 2021

Aparentemente, EF Core ahora es compatible con ulong -- vea la respuesta de @JimbobTheSailor a continuación.

Versiones anteriores de Entity Framework:

Resulta que Entity Framework no es compatible con unsigned tipos de datos. Para uint columnas, uno podría simplemente almacenar el valor en un tipo de datos firmado con un rango más grande (es decir, un long ). ¿Qué hay de ulong? columnas? La solución común no podría funcionar para mí porque no hay un tipo de datos firmado compatible con EF que pueda contener un ulong sin rebosar.

Después de pensar un poco, descubrí una solución simple a este problema:simplemente almacene los datos en el long compatible escriba y envíelo a ulong cuando se accede. Podrías estar pensando:"¡Pero espera, el valor máximo de ulong> valor máximo de long!" Aún puede almacenar los bytes de un ulong en un long y luego convertirlo de nuevo en ulong cuando lo necesite, ya que ambos tienen 8 bytes. Esto le permitirá guardar una variable ulong en una base de datos a través de 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;
        }
    }
}

El casting está unchecked para evitar excepciones de desbordamiento.

Espero que esto ayude a alguien.