Mysql
 sql >> Base de données >  >> RDS >> Mysql

Comment utiliser des types int/long non signés avec Entity Framework ?

Mise à jour février 2021

Apparemment, EF Core prend désormais en charge ulong -- voir la réponse de @JimbobTheSailor ci-dessous.

Anciennes versions d'Entity Framework :

Il s'avère que Entity Framework ne prend pas en charge unsigned Types de données. Pour uint colonnes, on pourrait simplement stocker la valeur dans un type de données signé avec une plage plus large (c'est-à-dire un long ). Qu'en est-il de ulong Colonnes? La solution commune ne pouvait pas fonctionner pour moi car il n'y a pas de type de données signé pris en charge par EF qui peut contenir un ulong sans déborder.

Après un peu de réflexion, j'ai trouvé une solution simple à ce problème :il suffit de stocker les données dans le long pris en charge. tapez et transmettez-le en ulong lors de l'accès. Vous pensez peut-être :"Mais attendez, la valeur maximale de ulong> la valeur maximale de long !" Vous pouvez toujours stocker les octets d'un ulong dans un long, puis le retransformer en ulong lorsque vous en avez besoin, car les deux ont 8 octets. Cela vous permettra d'enregistrer une variable ulong dans une base de données via 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;
        }
    }
}

Le casting est unchecked pour éviter les exceptions de débordement.

J'espère que cela aidera quelqu'un.