Class properties with the long
data type are properly mapped when adding a new migration (code-first), but ulong
data types are skipped by mysql's EF provider. How does one map a property to use mysql's unsigned bigint
?
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.
Update Entity Framework Core Feb 2021
EF Core 3.1: EF Core now supports long and ulong types. Using code first, the long or ulong is mapped to EF Core's new 'Decimal Type'
public ulong MyULong{ get; set; } //==> decimal(20, 0)
A ulong results in a decimal being defined in the database with 20 digits and 0 digits to the right of the decimal point, which is sufficient to store a 64 bit ulong.
EF 5: Thankyou to @Tomasz for noting that in EF 5 and 6 the ulong is mapped to a BigInt, rather than the Decimal type as per my original answer, now under the heading "EF Core 3.1" above
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With