Skip to content

Commit c3a29ea

Browse files
committed
Handling stored procedure operations which have UDTs.
1 parent 90a98de commit c3a29ea

File tree

5 files changed

+69
-29
lines changed

5 files changed

+69
-29
lines changed

Modules/Intent.Modules.EntityFrameworkCore.Repositories/FactoryExtensions/CustomRepositoryMethodsExtension.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ protected override void OnAfterTemplateRegistrations(IApplication application)
4646
var hasTypeDefinitionResults = repositoryModels
4747
.SelectMany(EntityFrameworkRepositoryHelpers.GetStoredProcedureModels)
4848
.Where(x => dbContextTemplate.ClassName == x.DbContextInstance.DbContextName)
49-
.Select(x => x.StoredProcedureModel.TypeReference?.Element.AsTypeDefinitionModel())
49+
.Select(x => x.ReturnType?.Element.AsTypeDefinitionModel())
5050
.Any(x => x != null);
5151

5252
if (hasTypeDefinitionResults)

Modules/Intent.Modules.EntityFrameworkCore.Repositories/Intent.EntityFrameworkCore.Repositories.imodspec

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
<?xml version="1.0" encoding="utf-8"?>
22
<package>
33
<id>Intent.EntityFrameworkCore.Repositories</id>
4-
<version>4.7.16</version>
4+
<version>4.7.17-pre.0</version>
55
<supportedClientVersions>[4.5.15-a,5.0.0)</supportedClientVersions>
66
<summary>Generates Repositories for Domain Entities</summary>
77
<description>Generates Repositories for Domain Entities</description>

Modules/Intent.Modules.EntityFrameworkCore.Repositories/Templates/DataContractExtensionMethods/DataContractExtensionMethodsTemplateRegistration.cs

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -36,12 +36,19 @@ public override ITemplate CreateTemplateInstance(IOutputTarget outputTarget, Dat
3636
[IntentManaged(Mode.Merge, Body = Mode.Ignore, Signature = Mode.Fully)]
3737
public override IEnumerable<DataContractModel> GetModels(IApplication application)
3838
{
39-
return _metadataManager.Domain(application).GetRepositoryModels()
39+
var spModels = _metadataManager.Domain(application).GetRepositoryModels()
4040
.SelectMany(repository => repository.GetStoredProcedureModels())
41-
.SelectMany(storedProcedure => storedProcedure.StoredProcedureModel.Parameters
42-
.Where(parameter => parameter.TypeReference.Element.IsDataContractModel())
43-
.Select(parameter => parameter.TypeReference.Element.AsDataContractModel()))
44-
.Distinct();
41+
.ToArray();
42+
var dcModels = spModels
43+
.SelectMany(storedProcedure => storedProcedure.Parameters
44+
.Where(parameter => parameter.ParameterType?.Element.IsDataContractModel() == true)
45+
.Select(parameter => parameter.ParameterType.Element.AsDataContractModel()))
46+
.Concat(spModels
47+
.Where(m => m.ReturnType?.Element.IsDataContractModel() == true)
48+
.Select(m => m.ReturnType.Element.AsDataContractModel()))
49+
.Distinct()
50+
.ToList();
51+
return dcModels;
4552
}
4653
}
4754
}

Modules/Intent.Modules.EntityFrameworkCore.Repositories/Templates/EntityFrameworkRepositoryHelpers.cs

Lines changed: 51 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727
using Intent.Utils;
2828
using OperationModel = Intent.Modelers.Domain.Api.OperationModel;
2929
using OperationModelExtensions = Intent.Modelers.Domain.Api.OperationModelExtensions;
30+
using ParameterModel = Intent.Modelers.Domain.Api.ParameterModel;
3031

3132
namespace Intent.Modules.EntityFrameworkCore.Repositories.Templates;
3233

@@ -624,47 +625,75 @@ internal record StoredProcedureModelPair
624625
{
625626
public StoredProcedureModelPair(StoredProcedureModel storedProcedureModel)
626627
{
627-
StoredProcedureModel = storedProcedureModel;
628+
StoredProcedureName = storedProcedureModel.Name;
629+
ReturnType = storedProcedureModel.ReturnType;
630+
Parameters = storedProcedureModel.Parameters.Select(x => new StoredProcedureModelParameter(x)).ToArray();
628631
DbContextInstance = new DbContextInstance(storedProcedureModel.InternalElement.Package.AsDomainPackageModel());
629632
}
633+
634+
public StoredProcedureModelPair(OperationModel operationModel)
635+
{
636+
StoredProcedureName = operationModel.Name;
637+
ReturnType = operationModel.ReturnType;
638+
Parameters = operationModel.Parameters.Select(x => new StoredProcedureModelParameter(x)).ToArray();
639+
DbContextInstance = new DbContextInstance(operationModel.InternalElement.Package.AsDomainPackageModel());
640+
}
641+
642+
public string StoredProcedureName { get; }
643+
public ITypeReference? ReturnType { get; }
644+
public IReadOnlyList<StoredProcedureModelParameter> Parameters { get; }
630645

631-
public StoredProcedureModel StoredProcedureModel { get; }
632646
public DbContextInstance DbContextInstance { get; }
633647
}
634648

649+
internal record StoredProcedureModelParameter
650+
{
651+
public StoredProcedureModelParameter(StoredProcedureParameterModel paramModel)
652+
{
653+
ParameterName = paramModel.Name;
654+
ParameterType = paramModel.TypeReference;
655+
}
656+
657+
public StoredProcedureModelParameter(ParameterModel paramModel)
658+
{
659+
ParameterName = paramModel.Name;
660+
ParameterType = paramModel.TypeReference;
661+
}
662+
663+
public string ParameterName { get; }
664+
public ITypeReference? ParameterType { get; }
665+
}
666+
635667
public static IReadOnlyCollection<StoredProcedureModelPair> GetStoredProcedureModels(this RepositoryModel repositoryModel)
636668
{
637669
return repositoryModel.InternalElement.ChildElements
638670
.SelectMany(childElement =>
639671
{
640672
var storedProcedureModel = childElement.AsStoredProcedureModel();
641-
if (storedProcedureModel != null)
673+
if (storedProcedureModel is not null)
642674
{
643675
return [new StoredProcedureModelPair(storedProcedureModel)];
644676
}
645677

646678
var operationModel = OperationModelExtensions.AsOperationModel(childElement);
647-
if (operationModel != null)
679+
var invokedStoredProcedures = operationModel.StoredProcedureInvocationTargets()
680+
.Select(x => x.TypeReference?.Element?.AsStoredProcedureModel())
681+
.Where(x => x != null)
682+
.Cast<StoredProcedureModel>()
683+
.Select(x => new StoredProcedureModelPair(x))
684+
.ToArray();
685+
686+
if (invokedStoredProcedures.Length > 0)
648687
{
649-
var invokedStoredProcedures = operationModel.StoredProcedureInvocationTargets()
650-
.Select(x => x.TypeReference?.Element?.AsStoredProcedureModel())
651-
.Where(x => x != null)
652-
.Cast<StoredProcedureModel>()
653-
.Select(x => new StoredProcedureModelPair(x))
654-
.ToArray();
655-
656-
if (invokedStoredProcedures.Length > 0)
657-
{
658-
return invokedStoredProcedures;
659-
}
688+
return invokedStoredProcedures;
689+
}
660690

661-
if (operationModel.HasStereotype("Stored Procedure"))
662-
{
663-
return [new StoredProcedureModelPair(new StoredProcedureModel(operationModel.InternalElement, OperationModel.SpecializationType))];
664-
}
691+
if (operationModel.HasStereotype("Stored Procedure"))
692+
{
693+
return [new StoredProcedureModelPair(operationModel)];
665694
}
666695

667-
return [];
696+
return Array.Empty<StoredProcedureModelPair>();
668697
})
669698
.ToArray();
670699
}
@@ -678,8 +707,8 @@ public static IReadOnlyCollection<DataContractModelPair> GetEntityTypeConfigurat
678707

679708
return [.. repositoryModels
680709
.SelectMany(GetStoredProcedureModels)
681-
.Select(x => x.StoredProcedureModel.TypeReference?.Element.AsDataContractModel() is not null
682-
? new DataContractModelPair(x.StoredProcedureModel.TypeReference.Element.AsDataContractModel(), x.DbContextInstance)
710+
.Select(x => x.ReturnType?.Element.AsDataContractModel() is not null
711+
? new DataContractModelPair(x.ReturnType.Element.AsDataContractModel(), x.DbContextInstance)
683712
: null)
684713
.Where(x => x != null)
685714
.Cast<DataContractModelPair>()

Modules/Intent.Modules.EntityFrameworkCore.Repositories/release-notes.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,7 @@
1+
### Version 4.7.17
2+
3+
- Fixed: Handling stored procedure operations which have UDTs.
4+
15
### Version 4.7.16
26

37
- Fixed: A software factory exception would occur when references were used in the Visual Studio designer.

0 commit comments

Comments
 (0)