Update Feb 2021
Apparently EF Core now supports ulong
-- see @JimbobTheSailor's answer below.
Older Entity Framework versions:
Turns out that Entity Framework does not support unsigned
data types. For uint
columns, one could just store the value in a signed data type with a larger range (that is, a long
). What about ulong
columns? The common solution couldn't work for me because there is no EF-supported signed data type that can hold a ulong
without overflowing.
After a bit of thinking, I figured out a simple solution to this problem: just store the data in the supported long
type and cast it to ulong
when accessed. You might be thinking: "But wait, ulong's max value > long's max value!" You can still store the bytes of a ulong in a long and then cast it back to ulong when you need it, since both have 8 bytes. This will allow you to save a ulong variable to a database through 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;
}
}
}
The casting is unchecked
to prevent overflow exceptions.
Hope this helps someone.
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…