Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Como usar tipos int/long não assinados com o Entity Framework?


Atualização de fevereiro de 2021

Aparentemente, o EF Core agora suporta ulong -- veja a resposta de @JimbobTheSailor abaixo.

Versões mais antigas do Entity Framework:

Acontece que o Entity Framework não suporta unsigned tipos de dados. Para uint colunas, pode-se armazenar o valor em um tipo de dados assinado com um intervalo maior (ou seja, um long ). E sobre ulong colunas? A solução comum não funcionou para mim porque não há nenhum tipo de dados assinado compatível com EF que possa conter um ulong sem transbordar.

Depois de pensar um pouco, descobri uma solução simples para esse problema:apenas armazene os dados no suporte long digite e converta para ulong quando acessado. Você pode estar pensando:"Mas espere, valor máximo de ulong> valor máximo de long!" Você ainda pode armazenar os bytes de um ulong em um long e depois convertê-lo de volta para ulong quando precisar, já que ambos têm 8 bytes. Isso permitirá que você salve uma variável ulong em um banco de dados por meio do 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;
        }
    }
}

A transmissão está unchecked para evitar exceções de estouro.

Espero que isso ajude alguém.