Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions src/EFCore/Storage/ValueConversion/EnumToNumberConverter.cs
Original file line number Diff line number Diff line change
Expand Up @@ -94,7 +94,7 @@ private static Expression<Func<TEnum, TNumber>> ToNumber()
return Expression.Lambda<Func<TEnum, TNumber>>(
Expression.Convert(
typeof(TNumber) == typeof(decimal)
? Expression.Convert(param, typeof(long))
? Expression.Convert(param, typeof(TEnum).GetEnumUnderlyingType())
: param,
typeof(TNumber)), param);
}
Expand All @@ -105,7 +105,7 @@ private static Expression<Func<TNumber, TEnum>> ToEnum()
return Expression.Lambda<Func<TNumber, TEnum>>(
Expression.Convert(
typeof(TNumber) == typeof(decimal)
? Expression.Convert(param, typeof(long))
? Expression.Convert(param, typeof(TEnum).GetEnumUnderlyingType())
: param,
typeof(TEnum)), param);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -161,53 +161,6 @@ public virtual Task Can_read_write_collection_of_ASCII_string_JSON_values(object
{ RelationalAnnotationNames.StoreType, storeType }, { CoreAnnotationNames.Unicode, false }
});

public override Task Can_read_write_ulong_enum_JSON_values(EnumU64 value, string json)
{
if (value == EnumU64.Max)
{
json = """{"Prop":-1}"""; // Because ulong is converted to long on SQL Server
}

return base.Can_read_write_ulong_enum_JSON_values(value, json);
}

public override Task Can_read_write_nullable_ulong_enum_JSON_values(object? value, string json)
{
if (Equals(value, ulong.MaxValue))
{
json = """{"Prop":-1}"""; // Because ulong is converted to long on SQL Server
}

return base.Can_read_write_nullable_ulong_enum_JSON_values(value, json);
}

public override Task Can_read_write_collection_of_ulong_enum_JSON_values()
=> Can_read_and_write_JSON_value<EnumU64CollectionType, List<EnumU64>>(
nameof(EnumU64CollectionType.EnumU64),
[
EnumU64.Min,
EnumU64.Max,
EnumU64.Default,
EnumU64.One,
(EnumU64)8
],
"""{"Prop":[0,-1,0,1,8]}""", // Because ulong is converted to long on SQL Server
mappedCollection: true);

public override Task Can_read_write_collection_of_nullable_ulong_enum_JSON_values()
=> Can_read_and_write_JSON_value<NullableEnumU64CollectionType, List<EnumU64?>>(
nameof(NullableEnumU64CollectionType.EnumU64),
[
EnumU64.Min,
null,
EnumU64.Max,
EnumU64.Default,
EnumU64.One,
(EnumU64?)8
],
"""{"Prop":[0,null,-1,0,1,8]}""", // Because ulong is converted to long on SQL Server
mappedCollection: true);

protected override void AssertElementFacets(IElementType element, Dictionary<string, object?>? facets)
{
base.AssertElementFacets(element, facets);
Expand Down
35 changes: 0 additions & 35 deletions test/EFCore.Sqlite.FunctionalTests/JsonTypesSqliteTest.cs
Original file line number Diff line number Diff line change
Expand Up @@ -223,41 +223,6 @@ protected class HalfType
public Half Half { get; set; }
}

public override Task Can_read_write_ulong_enum_JSON_values(EnumU64 value, string json)
=> Can_read_and_write_JSON_value<EnumU64Type, EnumU64>(nameof(EnumU64Type.EnumU64), value, json);

public override Task Can_read_write_nullable_ulong_enum_JSON_values(object? value, string json)
=> Can_read_and_write_JSON_value<NullableEnumU64Type, EnumU64?>(
nameof(NullableEnumU64Type.EnumU64),
value == null ? default(EnumU64?) : (EnumU64)value, json);

public override Task Can_read_write_collection_of_ulong_enum_JSON_values()
=> Can_read_and_write_JSON_value<EnumU64CollectionType, List<EnumU64>>(
nameof(EnumU64CollectionType.EnumU64),
[
EnumU64.Min,
EnumU64.Max,
EnumU64.Default,
EnumU64.One,
(EnumU64)8
],
"""{"Prop":[0,18446744073709551615,0,1,8]}""",
mappedCollection: true);

public override Task Can_read_write_collection_of_nullable_ulong_enum_JSON_values()
=> Can_read_and_write_JSON_value<NullableEnumU64CollectionType, List<EnumU64?>>(
nameof(NullableEnumU64CollectionType.EnumU64),
[
EnumU64.Min,
null,
EnumU64.Max,
EnumU64.Default,
EnumU64.One,
(EnumU64?)8
],
"""{"Prop":[0,null,18446744073709551615,0,1,8]}""",
mappedCollection: true);

protected override ITestStoreFactory NonSharedTestStoreFactory
=> SqliteTestStoreFactory.Instance;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -124,6 +124,31 @@ public void Can_convert_decimals_to_enums()
Assert.Equal(default, converter(0));
}

private static readonly ValueConverter<Planets, decimal> _unsignedEnumToDecimal
= new EnumToNumberConverter<Planets, decimal>();

[Fact]
public void Can_convert_unsigned_enums_to_decimals()
{
var converter = _unsignedEnumToDecimal.ConvertToProviderExpression.Compile();

Assert.Equal(1m, converter(Planets.Mercury));
Assert.Equal(9223372036854775808m, converter(Planets.Venus));
Assert.Equal(18446744073709551615m, converter(Planets.Earth));
Assert.Equal(0m, converter(default));
}

[Fact]
public void Can_convert_decimals_to_unsigned_enums()
{
var converter = _unsignedEnumToDecimal.ConvertFromProviderExpression.Compile();

Assert.Equal(Planets.Mercury, converter(1m));
Assert.Equal(Planets.Venus, converter(9223372036854775808m));
Assert.Equal(Planets.Earth, converter(18446744073709551615m));
Assert.Equal(default, converter(0m));
}

private static readonly ValueConverter<Beatles, float> _enumToFloat
= new EnumToNumberConverter<Beatles, float>();

Expand Down Expand Up @@ -272,4 +297,11 @@ private enum Beatles
George = 1,
Ringo = -1
}

private enum Planets : ulong
{
Mercury = 1,
Venus = 9223372036854775808,
Earth = ulong.MaxValue
}
}
Loading