Skip to content
This repository was archived by the owner on Dec 24, 2022. It is now read-only.

Commit f33474d

Browse files
committed
Merge pull request #497 from ServiceStack/nullable-enum-int
MySQL issue with nullable enum + int casting prob
2 parents 1132290 + fbce16f commit f33474d

File tree

2 files changed

+137
-2
lines changed

2 files changed

+137
-2
lines changed

src/ServiceStack.OrmLite.MySql.Tests/EnumTests.cs

Lines changed: 127 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
using System.Linq;
22
using NUnit.Framework;
3+
using ServiceStack.DataAnnotations;
34

45
namespace ServiceStack.OrmLite.MySql.Tests
56
{
@@ -35,6 +36,36 @@ public void CanGetEnumValue()
3536
}
3637
}
3738

39+
[Test]
40+
public void CanCreateTableNullableEnum()
41+
{
42+
OpenDbConnection().CreateTable<TypeWithNullableEnum>(true);
43+
}
44+
45+
[Test]
46+
public void CanStoreNullableEnumValue()
47+
{
48+
using (var con = OpenDbConnection())
49+
{
50+
con.CreateTable<TypeWithNullableEnum>(true);
51+
con.Save(new TypeWithNullableEnum { Id = 1, EnumValue = SomeEnum.Value1 });
52+
}
53+
}
54+
55+
[Test]
56+
public void CanGetNullableEnumValue()
57+
{
58+
using (var con = OpenDbConnection())
59+
{
60+
con.CreateTable<TypeWithNullableEnum>(true);
61+
var obj = new TypeWithNullableEnum { Id = 1, EnumValue = SomeEnum.Value1 };
62+
con.Save(obj);
63+
var target = con.SingleById<TypeWithNullableEnum>(obj.Id);
64+
Assert.AreEqual(obj.Id, target.Id);
65+
Assert.AreEqual(obj.EnumValue, target.EnumValue);
66+
}
67+
}
68+
3869
[Test]
3970
public void CanQueryByEnumValue_using_select_with_expression()
4071
{
@@ -82,6 +113,72 @@ public void CanQueryByEnumValue_using_where_with_AnonType()
82113
Assert.AreEqual(2, target.Count());
83114
}
84115
}
116+
117+
[Test]
118+
public void CanQueryByNullableEnumValue_using_where_with_AnonType()
119+
{
120+
using (var con = OpenDbConnection())
121+
{
122+
con.CreateTable<TypeWithEnum>(true);
123+
con.Save(new TypeWithNullableEnum { Id = 1, EnumValue = SomeEnum.Value1, IntEnum = SomeIntEnum.One });
124+
con.Save(new TypeWithNullableEnum { Id = 2, EnumValue = SomeEnum.Value1, IntEnum = SomeIntEnum.One });
125+
con.Save(new TypeWithNullableEnum { Id = 3, EnumValue = SomeEnum.Value2, IntEnum = SomeIntEnum.Two });
126+
127+
var target = con.Where<TypeWithNullableEnum>(new { EnumValue = SomeEnum.Value1 });
128+
var enumInt = con.Where<TypeWithNullableEnum>(new {IntEnum = SomeIntEnum.One});
129+
130+
Assert.AreEqual(2, target.Count);
131+
Assert.AreEqual(2, enumInt.Count);
132+
}
133+
}
134+
135+
[Test]
136+
public void CanSaveNullableEnum_with_specific_id_select_with_anon_type()
137+
{
138+
using (var con = OpenDbConnection())
139+
{
140+
con.CreateTableIfNotExists<MyObj>();
141+
var myObj = new MyObj();
142+
myObj.Id = 1;
143+
myObj.Test = MyEnum.One;
144+
con.Insert(myObj);
145+
146+
myObj = con.Single<MyObj>(new {Id = 1});
147+
148+
Assert.That(myObj.Id, Is.EqualTo(1));
149+
Assert.That(myObj.Test, Is.Not.EqualTo(null));
150+
Assert.That(myObj.Test, Is.EqualTo(MyEnum.One));
151+
}
152+
}
153+
154+
[Test]
155+
public void CanSaveNullableEnum_with_specific_id_select_with_type()
156+
{
157+
using (var existsCon = OpenDbConnection())
158+
{
159+
existsCon.CreateTableIfNotExists<MyObj>();
160+
var exists = existsCon.SingleById<MyObj>(1);
161+
if (exists != null)
162+
{
163+
existsCon.DeleteById<MyObj>(1);
164+
}
165+
}
166+
167+
using (var con = OpenDbConnection())
168+
{
169+
170+
var myObj = new MyObj();
171+
myObj.Id = 1;
172+
myObj.Test = MyEnum.One;
173+
con.Insert(myObj);
174+
175+
myObj = con.Single<MyObj>(x => x.Id == 1);
176+
177+
Assert.That(myObj.Id, Is.EqualTo(1));
178+
Assert.That(myObj.Test, Is.Not.EqualTo(null));
179+
Assert.That(myObj.Test, Is.EqualTo(MyEnum.One));
180+
}
181+
}
85182
}
86183

87184
public enum SomeEnum : long
@@ -91,9 +188,38 @@ public enum SomeEnum : long
91188
Value3
92189
}
93190

191+
[EnumAsInt]
192+
public enum SomeIntEnum
193+
{
194+
Zero = 0,
195+
One = 1,
196+
Two = 2
197+
}
198+
199+
[EnumAsInt]
200+
public enum MyEnum : int
201+
{
202+
Zero = 0,
203+
One = 1
204+
}
205+
206+
public class MyObj
207+
{
208+
public int Id { get; set; }
209+
public MyEnum? Test { get; set; }
210+
}
211+
94212
public class TypeWithEnum
95213
{
96214
public int Id { get; set; }
97-
public SomeEnum EnumValue { get; set; }
215+
public SomeEnum EnumValue { get; set; }
216+
public SomeIntEnum IntEnum { get; set; }
217+
}
218+
219+
public class TypeWithNullableEnum
220+
{
221+
public int Id { get; set; }
222+
public SomeEnum? EnumValue { get; set; }
223+
public SomeIntEnum? IntEnum { get; set; }
98224
}
99225
}

src/ServiceStack.OrmLite/OrmLiteWriteCommandExtensions.cs

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -341,7 +341,16 @@ public static T PopulateWithSqlReader<T>(this T objWithProperties,
341341
else
342342
{
343343
var fieldValue = converter.FromDbValue(fieldDef.FieldType, value);
344-
fieldDef.SetValueFn(objWithProperties, fieldValue);
344+
if (fieldDef.FieldType.IsEnum && fieldDef.IsNullable)
345+
{
346+
var enumType = Nullable.GetUnderlyingType(fieldDef.PropertyInfo.PropertyType);
347+
var enumValue = Enum.ToObject(enumType, value);
348+
fieldDef.PropertyInfo.SetProperty(objWithProperties, enumValue);
349+
}
350+
else
351+
{
352+
fieldDef.SetValueFn(objWithProperties, fieldValue);
353+
}
345354
}
346355
}
347356
}

0 commit comments

Comments
 (0)