diff --git a/NewPlatform.Flexberry.ORM.ODataService.nuspec b/NewPlatform.Flexberry.ORM.ODataService.nuspec index 997f6282..708f56d0 100644 --- a/NewPlatform.Flexberry.ORM.ODataService.nuspec +++ b/NewPlatform.Flexberry.ORM.ODataService.nuspec @@ -2,7 +2,7 @@ NewPlatform.Flexberry.ORM.ODataService - 7.1.1-beta02 + 7.1.1-beta03 Flexberry ORM ODataService New Platform Ltd. New Platform Ltd. @@ -14,9 +14,12 @@ Changed 1. Updated `NewPlatform.Flexberry.ORM` up to `7.1.1-beta01`. + 2. Get properties from objects for send it to frontend always rethrow exception now. Fixed 1. Fixed problem with metadata when inheritance and PublishName is used. + 2. Safe load details with complex type usage hierarchy. + Copyright New Platform Ltd 2023 Flexberry ORM OData ODataService diff --git a/NewPlatform.Flexberry.ORM.ODataService/Extensions/DataServiceExtensions.cs b/NewPlatform.Flexberry.ORM.ODataService/Extensions/DataServiceExtensions.cs index da766c19..9d0ddd9b 100644 --- a/NewPlatform.Flexberry.ORM.ODataService/Extensions/DataServiceExtensions.cs +++ b/NewPlatform.Flexberry.ORM.ODataService/Extensions/DataServiceExtensions.cs @@ -88,7 +88,33 @@ public static void SafeLoadDetails(this IDataService dataService, View view, ILi // Нужно гарантировать, что у загруженных детейлов будет проставлена ссылка на агрегатора, поэтому добавим свойство в представление (если уже есть, то второй раз не добавится). detailView.AddProperty(agregatorPropertyName); LoadingCustomizationStruct lcs = LoadingCustomizationStruct.GetSimpleStruct(detailView.DefineClassType, detailView); - lcs.LoadingTypes = TypeUsageProvider.TypeUsage.GetUsageTypes(view.DefineClassType, detailInView.Name); + Type[] usageTypes = TypeUsageProvider.TypeUsage.GetUsageTypes(view.DefineClassType, detailInView.Name); + List storedTypes = new List(); + foreach (var usageType in usageTypes) + { + if (Information.IsStoredType(usageType)) + { + storedTypes.Add(usageType); + } + } + + if (!storedTypes.Any()) + { + foreach (DataObject agregator in agregators) + { + Type agregatorType = agregator.GetType(); + Type[] usageTypesFromAgregator = TypeUsageProvider.TypeUsage.GetUsageTypes(agregatorType, detailInView.Name); + foreach (Type usageTypeFromAgregator in usageTypesFromAgregator) + { + if (Information.IsStoredType(usageTypeFromAgregator) && !storedTypes.Contains(usageTypeFromAgregator)) + { + storedTypes.Add(usageTypeFromAgregator); + } + } + } + } + + lcs.LoadingTypes = storedTypes.ToArray(); Type agregatorKeyType = agregators[0].__PrimaryKey.GetType(); // Производим обработку только тех агрегаторов, для которых ранее не был загружен детейл.