Skip to content

Commit e2ce15e

Browse files
committed
Fix: TableValued Function returns complex type with nested enum
1 parent b6f107b commit e2ce15e

File tree

2 files changed

+50
-1
lines changed

2 files changed

+50
-1
lines changed

CodeFirstStoreFunctions/StoreFunctionBuilder.cs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -115,7 +115,9 @@ private EdmType CreateReturnRowType(string propertyName, EdmType edmType)
115115
return
116116
RowType.Create(
117117
((StructuralType) edmType).Members.Select(
118-
m => EdmProperty.Create(m.Name, GetStorePrimitiveTypeUsage(m.TypeUsage))), null);
118+
m => m.TypeUsage.EdmType.BuiltInTypeKind == BuiltInTypeKind.EnumType ?
119+
EdmProperty.Create(m.Name, GetStorePrimitiveTypeUsage(TypeUsage.CreateDefaultTypeUsage(((EnumType)m.TypeUsage.EdmType).UnderlyingType))) :
120+
EdmProperty.Create(m.Name, GetStorePrimitiveTypeUsage(m.TypeUsage))), null);
119121
}
120122

121123
if (edmType.BuiltInTypeKind == BuiltInTypeKind.EnumType)

CodeFirstStoreFunctionsTests/StoreFunctionBuilderTests.cs

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,13 +55,16 @@ public void Crate_creates_store_function_for_complex_type_function_import()
5555
var model = new DbModelBuilder()
5656
.Build(new DbProviderInfo("System.Data.SqlClient", "2012"));
5757

58+
var enumType = EnumType.Create("TestEnum", "TestNs",PrimitiveType.GetEdmPrimitiveType(PrimitiveTypeKind.Int32), false, new EnumMember[]{EnumMember.Create("foo", 1, null)}, null);
59+
5860
var complexType = ComplexType.Create("CT", "ns", DataSpace.CSpace,
5961
new[]
6062
{
6163
EdmProperty.Create("Street",
6264
TypeUsage.CreateDefaultTypeUsage(PrimitiveType.GetEdmPrimitiveType(PrimitiveTypeKind.String))),
6365
EdmProperty.Create("ZipCode",
6466
TypeUsage.CreateDefaultTypeUsage(PrimitiveType.GetEdmPrimitiveType(PrimitiveTypeKind.Int32))),
67+
EdmProperty.Create("MyEnum", TypeUsage.CreateDefaultTypeUsage(enumType))
6568
},
6669
null);
6770

@@ -87,6 +90,50 @@ public void Crate_creates_store_function_for_complex_type_function_import()
8790
Assert.False(storeFunction.IsComposableAttribute);
8891
}
8992

93+
[Fact]
94+
public void Crate_creates_store_function_for_complex_type_withEnum_in_TableValuedFunction()
95+
{
96+
var model = new DbModelBuilder()
97+
.Build(new DbProviderInfo("System.Data.SqlClient", "2012"));
98+
99+
var enumType = EnumType.Create("TestEnum", "TestNs", PrimitiveType.GetEdmPrimitiveType(PrimitiveTypeKind.Int32), false, new EnumMember[] { EnumMember.Create("foo", 1, null) }, null);
100+
101+
var complexType = ComplexType.Create("CT", "ns", DataSpace.CSpace,
102+
new[]
103+
{
104+
EdmProperty.Create("Street",
105+
TypeUsage.CreateDefaultTypeUsage(PrimitiveType.GetEdmPrimitiveType(PrimitiveTypeKind.String))),
106+
EdmProperty.Create("ZipCode",
107+
TypeUsage.CreateDefaultTypeUsage(PrimitiveType.GetEdmPrimitiveType(PrimitiveTypeKind.Int32))),
108+
EdmProperty.Create("MyEnum", TypeUsage.CreateDefaultTypeUsage(enumType))
109+
},
110+
null);
111+
112+
var functionDescriptor =
113+
new FunctionDescriptor(
114+
"f",
115+
new[]
116+
{new ParameterDescriptor("p1", PrimitiveType.GetEdmPrimitiveType(PrimitiveTypeKind.String), null, false)},
117+
new EdmType[] { complexType },
118+
"ResultCol",
119+
"dbo",
120+
StoreFunctionKind.TableValuedFunction,
121+
isBuiltIn: null);
122+
123+
var storeFunction = new StoreFunctionBuilder(model, "docs", "ns").Create(functionDescriptor);
124+
125+
Assert.Equal(
126+
BuiltInTypeKind.CollectionType,
127+
storeFunction.ReturnParameter.TypeUsage.EdmType.BuiltInTypeKind);
128+
129+
Assert.Equal(1, storeFunction.Parameters.Count);
130+
Assert.Equal("p1", storeFunction.Parameters[0].Name);
131+
Assert.Equal("nvarchar(max)", storeFunction.Parameters[0].TypeName);
132+
Assert.Equal(ParameterMode.In, storeFunction.Parameters[0].Mode);
133+
Assert.True(storeFunction.IsComposableAttribute);
134+
}
135+
136+
90137
[Fact]
91138
public void Crate_creates_store_function_for_enum_type_function_import()
92139
{

0 commit comments

Comments
 (0)