web-dev-qa-db-ja.com

Entity Frameworkでunsigned int / long型を使用するにはどうすればよいですか?

longデータ型のクラスプロパティは、新しい移行を追加するときに適切にマップされます(コードファースト)。ただし、ulongデータ型は、mysqlのEFプロバイダーによってスキップされます。 mysqlのunsigned bigintを使用するようにプロパティをどのようにマップしますか?

24
arao6

Entity Frameworkはunsignedデータ型をサポートしていないことが判明しました。 uint列の場合、値をより大きな範囲の符号付きデータ型(つまり、long)に格納するだけで済みます。 ulong列についてはどうですか?オーバーフローせずにulongを保持できるEFでサポートされている署名済みデータ型がないため、一般的なソリューションは私にとっては機能しませんでした。

少し考えた後、この問題の簡単な解決策を見つけました。サポートされているlong型にデータを格納し、アクセス時にそれをulongにキャストするだけです。 「待って、ulongの最大値> longの最大値!」 ulongのバイトをlongに格納し、必要に応じてulongにキャストして戻すことができます。どちらも8バイトであるためです。これにより、EFを通じてulong変数をデータベースに保存できます。

// 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;
        }
    }
}

オーバーフロー例外を防ぐために、キャストはuncheckedです。

これが誰かを助けることを願っています。

42
arao6