diff --git a/CHANGELOG.md b/CHANGELOG.md index cc8187bd..9ca34b78 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,8 +7,10 @@ This project adheres to [Semantic Versioning](http://semver.org/). ### Added ### Changed +1. Updated `NewPlatform.Flexberry.ORM` up to `7.1.1-beta01`. ### Fixed +1. Fixed problem with metadata when inheritance and PublishName is used. ## [7.1.0] - 2023.04.12 diff --git a/NewPlatform.Flexberry.ORM.ODataService.Files/NewPlatform.Flexberry.ORM.ODataService.Files.csproj b/NewPlatform.Flexberry.ORM.ODataService.Files/NewPlatform.Flexberry.ORM.ODataService.Files.csproj index 6443def9..c95c47da 100644 --- a/NewPlatform.Flexberry.ORM.ODataService.Files/NewPlatform.Flexberry.ORM.ODataService.Files.csproj +++ b/NewPlatform.Flexberry.ORM.ODataService.Files/NewPlatform.Flexberry.ORM.ODataService.Files.csproj @@ -21,7 +21,7 @@ all runtime; build; native; contentfiles; analyzers; buildtransitive - + all runtime; build; native; contentfiles; analyzers; buildtransitive diff --git a/NewPlatform.Flexberry.ORM.ODataService.WebApi/NewPlatform.Flexberry.ORM.ODataService.WebApi.csproj b/NewPlatform.Flexberry.ORM.ODataService.WebApi/NewPlatform.Flexberry.ORM.ODataService.WebApi.csproj index c29f2c93..5293c358 100644 --- a/NewPlatform.Flexberry.ORM.ODataService.WebApi/NewPlatform.Flexberry.ORM.ODataService.WebApi.csproj +++ b/NewPlatform.Flexberry.ORM.ODataService.WebApi/NewPlatform.Flexberry.ORM.ODataService.WebApi.csproj @@ -22,7 +22,7 @@ runtime; build; native; contentfiles; analyzers; buildtransitive - + all runtime; build; native; contentfiles; analyzers; buildtransitive diff --git a/NewPlatform.Flexberry.ORM.ODataService.nuspec b/NewPlatform.Flexberry.ORM.ODataService.nuspec index 13a49fab..997f6282 100644 --- a/NewPlatform.Flexberry.ORM.ODataService.nuspec +++ b/NewPlatform.Flexberry.ORM.ODataService.nuspec @@ -2,7 +2,7 @@ NewPlatform.Flexberry.ORM.ODataService - 7.1.0 + 7.1.1-beta02 Flexberry ORM ODataService New Platform Ltd. New Platform Ltd. @@ -13,7 +13,10 @@ Flexberry ORM OData Service Package. Changed - 1. Updated `NewPlatform.Flexberry.ORM` up to `7.1.0`. + 1. Updated `NewPlatform.Flexberry.ORM` up to `7.1.1-beta01`. + + Fixed + 1. Fixed problem with metadata when inheritance and PublishName is used. Copyright New Platform Ltd 2023 Flexberry ORM OData ODataService diff --git a/NewPlatform.Flexberry.ORM.ODataService/Expressions/EdmLibHelpers.cs b/NewPlatform.Flexberry.ORM.ODataService/Expressions/EdmLibHelpers.cs index 86ab66e7..ef8eddec 100644 --- a/NewPlatform.Flexberry.ORM.ODataService/Expressions/EdmLibHelpers.cs +++ b/NewPlatform.Flexberry.ORM.ODataService/Expressions/EdmLibHelpers.cs @@ -351,7 +351,7 @@ private static string EdmName(this Type clrType) private static string EdmFullName(this Type clrType) { - return string.IsNullOrEmpty(clrType.Namespace) ? clrType.EdmName() : string.Format(CultureInfo.InvariantCulture, "{0}.{1}", clrType.Namespace, clrType.EdmName()); + return string.Format(CultureInfo.InvariantCulture, "{0}.{1}", clrType.Namespace, clrType.EdmName()); } private static IEdmPrimitiveType GetPrimitiveType(EdmPrimitiveTypeKind primitiveKind) diff --git a/NewPlatform.Flexberry.ORM.ODataService/Extensions/ODataApplicationBuilderExtensions.cs b/NewPlatform.Flexberry.ORM.ODataService/Extensions/ODataApplicationBuilderExtensions.cs index 9c936c27..a18efe34 100644 --- a/NewPlatform.Flexberry.ORM.ODataService/Extensions/ODataApplicationBuilderExtensions.cs +++ b/NewPlatform.Flexberry.ORM.ODataService/Extensions/ODataApplicationBuilderExtensions.cs @@ -1,11 +1,15 @@ #if NETSTANDARD namespace NewPlatform.Flexberry.ORM.ODataService.Extensions { - using System; + using System; + using System.IO; + using System.Net.Mime; + using System.Threading.Tasks; using Microsoft.AspNet.OData; using Microsoft.AspNet.OData.Common; using Microsoft.AspNet.OData.Extensions; - using Microsoft.AspNetCore.Builder; + using Microsoft.AspNetCore.Builder; + using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Routing; using NewPlatform.Flexberry.ORM.ODataService.Middleware; @@ -30,6 +34,11 @@ public static IApplicationBuilder UseODataService(this IApplicationBuilder app, VerifyODataServiceIsRegistered(app); + app.Use(async (context, next) => + { + await RewriteResponse(context, next); + }); + return app .UseODataBatching() .UseMiddleware() @@ -48,6 +57,59 @@ private static void VerifyODataServiceIsRegistered(IApplicationBuilder app) throw Error.InvalidOperation(SRResources.MissingODataServices, nameof(IPerRouteContainer)); } } + + /// + /// Removing of extra symbols from response. + /// + /// Context of request. + /// Next middleware. + /// Formed task. + public static async Task RewriteResponse(HttpContext context, Func next) + { + /* Same code for NETFRAMEWORK is placed on NewPlatform.Flexberry.ORM.ODataService.Handlers.PostPatchHandler.*/ + using (var responseBodyStream = new MemoryStream()) + { + Stream bodyStream = context.Response.Body; + + try + { + context.Response.Body = responseBodyStream; + + await next(); + + responseBodyStream.Seek(0, SeekOrigin.Begin); + var responseBody = new StreamReader(responseBodyStream).ReadToEnd(); + + //Modify the response in some way. + if (context.Response.ContentType != null && + (context.Response.ContentType.Contains("application/json") + || context.Response.ContentType.Contains("application/xml") + || context.Response.ContentType.Contains("multipart/mixed"))) + { + responseBody = responseBody + .Replace("(____.", "(") + .Replace("\"____.", "\"") + .Replace("____.", ".") + .Replace(" Namespace=\"____\"", " Namespace=\"\""); + } + + using (MemoryStream newStream = new MemoryStream()) + { + using StreamWriter sw = new StreamWriter(newStream); + sw.Write(responseBody); + sw.Flush(); + + newStream.Seek(0, SeekOrigin.Begin); + + await newStream.CopyToAsync(bodyStream); + } + } + finally + { + context.Response.Body = bodyStream; + } + } + } } } #endif diff --git a/NewPlatform.Flexberry.ORM.ODataService/Handlers/PostPatchHandler.cs b/NewPlatform.Flexberry.ORM.ODataService/Handlers/PostPatchHandler.cs index ae7c0e1d..37ceafba 100644 --- a/NewPlatform.Flexberry.ORM.ODataService/Handlers/PostPatchHandler.cs +++ b/NewPlatform.Flexberry.ORM.ODataService/Handlers/PostPatchHandler.cs @@ -1,6 +1,10 @@ #if NETFRAMEWORK namespace NewPlatform.Flexberry.ORM.ODataService.Handlers -{ +{ + using Microsoft.AspNet.OData.Batch; + using System; + using System.IO; + using System.Net; using System.Net.Http; using System.Threading; using System.Threading.Tasks; @@ -33,8 +37,13 @@ public class PostPatchHandler : DelegatingHandler public const string AcceptApplicationMsExcel = "PostPatchHandler_AcceptApplicationMsExcel"; /// - protected override Task SendAsync(HttpRequestMessage request, CancellationToken cancellationToken) + protected override async Task SendAsync(HttpRequestMessage request, CancellationToken cancellationToken) { + if (request == null) + { + throw new ArgumentNullException(nameof(request)); + } + foreach (var val in request.Headers.Accept) { if (val.MediaType == "application/ms-excel") @@ -62,9 +71,54 @@ protected override Task SendAsync(HttpRequestMessage reques /// Исправление для Mono, взято из https://github.com/OData/odata.net/issues/165 */ if (!request.Headers.Contains("Accept-Charset")) - request.Headers.Add("Accept-Charset", new[] { "utf-8" }); + request.Headers.Add("Accept-Charset", new[] { "utf-8" }); + + HttpResponseMessage responseMessage = await base.SendAsync(request, cancellationToken); + await RewriteResponse(responseMessage); + return responseMessage; + + } - return base.SendAsync(request, cancellationToken); + /// + /// Удаление некорректных символов в именах типов метаданных. + /// Данные символы добавляются специально, чтобы MS не бросало исключение на пустой Namespace у типов с PublishName. + /// + /// Текущее ответное сообщение, в котором могут быть заменены символы. + /// Задача на обработку. + private static async Task RewriteResponse(HttpResponseMessage response) + { + /* Same code for NETSTANDARD is placed on NewPlatform.Flexberry.ORM.ODataService.Extensions.ODataApplicationBuilderExtensions.*/ + string contentType = response?.Content?.Headers?.ContentType?.MediaType; + if (!string.IsNullOrEmpty(contentType) && + (contentType.Contains("application/json") + || contentType.Contains("application/xml") + || contentType.Contains("multipart/mixed"))) + { + HttpContent content = response.Content; + Stream contentStream = await content.ReadAsStreamAsync(); + string responseStr = new StreamReader(contentStream).ReadToEnd(); + if (!string.IsNullOrEmpty(responseStr) && responseStr.Length > 3) + { + responseStr = responseStr + .Replace("(____.", "(") + .Replace("\"____.", "\"") + .Replace("____.", ".") + .Replace(" Namespace=\"____\"", " Namespace=\"\""); + + using (MemoryStream newStream = new MemoryStream()) + { + using StreamWriter sw = new StreamWriter(newStream); + sw.Write(responseStr); + sw.Flush(); + newStream.Seek(0, SeekOrigin.Begin); + + contentStream.Position = 0; + contentStream.SetLength(responseStr.Length); + + await newStream.CopyToAsync(contentStream); + } + } + } } } } diff --git a/NewPlatform.Flexberry.ORM.ODataService/Model/DataObjectEdmModel.cs b/NewPlatform.Flexberry.ORM.ODataService/Model/DataObjectEdmModel.cs index 0b9f94e3..c386f791 100644 --- a/NewPlatform.Flexberry.ORM.ODataService/Model/DataObjectEdmModel.cs +++ b/NewPlatform.Flexberry.ORM.ODataService/Model/DataObjectEdmModel.cs @@ -153,10 +153,7 @@ private void BuildTypeHierarchy() else _typeHierarchy[baseDataObjectType].Add(dataObjectType); - string nameSpace = GetEntityTypeNamespace(dataObjectType); - string typeName = GetEntityTypeName(dataObjectType); - - var typeFullName = string.IsNullOrEmpty(nameSpace) ? typeName : $"{nameSpace}.{typeName}"; + var typeFullName = $"{GetEntityTypeNamespace(dataObjectType)}.{GetEntityTypeName(dataObjectType)}"; if (!_aliasesNameToProperty.ContainsKey(typeFullName)) { _aliasesNameToProperty.Add(typeFullName, new Dictionary()); @@ -724,7 +721,7 @@ private string GetEntityTypeName(Type type) var nameSpace = GetEntityTypeNamespace(type); if (type != typeof(DataObject) && EdmModelBuilder != null && EdmModelBuilder.EntityTypeNameBuilder != null) name = EdmModelBuilder.EntityTypeNameBuilder(type); - var fullname = string.IsNullOrEmpty(nameSpace) ? name : $"{nameSpace}.{name}"; + var fullname = $"{nameSpace}.{name}"; if (!_aliasesNameToType.ContainsKey(fullname)) _aliasesNameToType.Add(fullname, type); if (!_aliasesTypeToName.ContainsKey(type)) @@ -762,9 +759,7 @@ private string GetEntityPropertyName(PropertyInfo prop) var name = prop.Name; if (name != KeyPropertyName && prop.DeclaringType != typeof(DataObject) && EdmModelBuilder != null && EdmModelBuilder.EntityPropertyNameBuilder != null) name = EdmModelBuilder.EntityPropertyNameBuilder(prop); - string nameSpace = GetEntityTypeNamespace(prop.DeclaringType); - string typeName = GetEntityTypeName(prop.DeclaringType); - string typeFullName = string.IsNullOrEmpty(nameSpace) ? typeName : $"{nameSpace}.{typeName}"; + var typeFullName = $"{GetEntityTypeNamespace(prop.DeclaringType)}.{GetEntityTypeName(prop.DeclaringType)}"; if (!_aliasesNameToProperty.ContainsKey(typeFullName)) { _aliasesNameToProperty.Add(typeFullName, new Dictionary()); diff --git a/NewPlatform.Flexberry.ORM.ODataService/Model/DefaultDataObjectEdmModelBuilder.cs b/NewPlatform.Flexberry.ORM.ODataService/Model/DefaultDataObjectEdmModelBuilder.cs index 9115e228..63f84ab6 100644 --- a/NewPlatform.Flexberry.ORM.ODataService/Model/DefaultDataObjectEdmModelBuilder.cs +++ b/NewPlatform.Flexberry.ORM.ODataService/Model/DefaultDataObjectEdmModelBuilder.cs @@ -324,8 +324,7 @@ private string BuildEntitySetName(Type dataObjectType) string typeName = BuildEntityTypeName(dataObjectType); string nameSpace = BuildEntityTypeNamespace(dataObjectType); - return string.Concat((_useNamespaceInEntitySetName && !string.IsNullOrEmpty(nameSpace)) ? $"{nameSpace}.{typeName}".Replace(".", string.Empty) : typeName, "s"/* "Aliases"*/).Replace("_", string.Empty); - //return string.Concat(_useNamespaceInEntitySetName ? dataObjectType.FullName.Replace(".", string.Empty) : dataObjectType.Name, "s"/* "Aliases"*/).Replace("_", string.Empty); + return string.Concat(_useNamespaceInEntitySetName ? $"{nameSpace}.{typeName}".Replace(".", string.Empty) : typeName, "s").Replace("_", string.Empty); } /// diff --git a/NewPlatform.Flexberry.ORM.ODataService/NewPlatform.Flexberry.ORM.ODataService.csproj b/NewPlatform.Flexberry.ORM.ODataService/NewPlatform.Flexberry.ORM.ODataService.csproj index f5e49399..956c37a7 100644 --- a/NewPlatform.Flexberry.ORM.ODataService/NewPlatform.Flexberry.ORM.ODataService.csproj +++ b/NewPlatform.Flexberry.ORM.ODataService/NewPlatform.Flexberry.ORM.ODataService.csproj @@ -26,7 +26,7 @@ runtime; build; native; contentfiles; analyzers; buildtransitive - + all runtime; build; native; contentfiles; analyzers; buildtransitive diff --git a/NewPlatform.Flexberry.ORM.ODataServiceCore.Common/NewPlatform.Flexberry.ORM.ODataServiceCore.Common.csproj b/NewPlatform.Flexberry.ORM.ODataServiceCore.Common/NewPlatform.Flexberry.ORM.ODataServiceCore.Common.csproj index 959f3040..bc24bf67 100644 --- a/NewPlatform.Flexberry.ORM.ODataServiceCore.Common/NewPlatform.Flexberry.ORM.ODataServiceCore.Common.csproj +++ b/NewPlatform.Flexberry.ORM.ODataServiceCore.Common/NewPlatform.Flexberry.ORM.ODataServiceCore.Common.csproj @@ -26,7 +26,7 @@ - + diff --git a/Tests/BusinessServers/NewPlatform.Flexberry.ORM.ODataService.Tests.BusinessServers.csproj b/Tests/BusinessServers/NewPlatform.Flexberry.ORM.ODataService.Tests.BusinessServers.csproj index e5c2a1e5..42fd38a2 100644 --- a/Tests/BusinessServers/NewPlatform.Flexberry.ORM.ODataService.Tests.BusinessServers.csproj +++ b/Tests/BusinessServers/NewPlatform.Flexberry.ORM.ODataService.Tests.BusinessServers.csproj @@ -14,10 +14,10 @@ - - - - + + + + all runtime; build; native; contentfiles; analyzers; buildtransitive diff --git a/Tests/NewPlatform.Flexberry.ORM.ODataService.Tests/CRUD/Read/GetTest.cs b/Tests/NewPlatform.Flexberry.ORM.ODataService.Tests/CRUD/Read/GetTest.cs new file mode 100644 index 00000000..019014ad --- /dev/null +++ b/Tests/NewPlatform.Flexberry.ORM.ODataService.Tests/CRUD/Read/GetTest.cs @@ -0,0 +1,106 @@ +namespace NewPlatform.Flexberry.ORM.ODataService.Tests.CRUD.Read +{ + using System; + using System.Collections.Generic; + using System.Net; + using System.Net.Http; + + using ICSSoft.STORMNET; + using ICSSoft.STORMNET.UserDataTypes; + using ICSSoft.STORMNET.Windows.Forms; + + using NewPlatform.Flexberry.ORM.ODataService.Tests.Extensions; + + using Newtonsoft.Json; + using Newtonsoft.Json.Linq; + + using Xunit; + + /// + /// Класс тестов для проверки корректной обработки Get-запросов. + /// + public class GetTest : BaseODataServiceIntegratedTest + { +#if NETCOREAPP + /// + /// Конструктор по-умолчанию. + /// + /// Фабрика для приложения. + /// Вывод отладочной информации. + public GetTest(CustomWebApplicationFactory factory, Xunit.Abstractions.ITestOutputHelper output) + : base(factory, output) + { + } +#endif + + /// + /// Проверка получения данных для классов, в которых есть нехранимые поля, который не содержат setter'ов. + /// (Такие варианты присутствуют в старом коде). + /// + [Fact] + public void TestGetNotStored() + { + ActODataService(args => + { + LegoBlock block = new LegoBlock { Name = "Легосити" }; + var objs = new DataObject[] { block }; + args.DataService.UpdateObjects(ref objs); + + string requestUrl = string.Format( + "http://localhost/odata/{0}?$select=__PrimaryKey,AssocType", + args.Token.Model.GetEdmEntitySet(typeof(LegoBlock)).Name); + + // Обращаемся к OData-сервису и обрабатываем ответ. + using (HttpResponseMessage response = args.HttpClient.GetAsync(requestUrl).Result) + { + // Убедимся, что запрос завершился успешно. + Assert.Equal(HttpStatusCode.OK, response.StatusCode); + + // Получим строку с ответом. + string receivedStr = response.Content.ReadAsStringAsync().Result.Beautify(); + + // Преобразуем полученный объект в словарь. + Dictionary receivedDict = JsonConvert.DeserializeObject>(receivedStr); + + Assert.Equal(1, ((JArray)receivedDict["value"]).Count); + } + }); + } + + /// + /// Проверка значение в атрибуте @odata.type. + /// + [Fact] + public void TestGetWithMaster() + { + ActODataService(args => + { + LegoBlock block = new LegoBlock { Name = "Легосити" }; + LegoPatent patent = new LegoPatent { Name = "ZeroM", BaseLegoBlock = block, Date = DateTime.Now }; + var objs = new DataObject[] { block, patent }; + args.DataService.UpdateObjects(ref objs); + + string requestUrl = string.Format( + "http://localhost/odata/{0}?$select=__PrimaryKey,Name&$expand=BaseLegoBlock($select=__PrimaryKey,Name)", + args.Token.Model.GetEdmEntitySet(typeof(LegoPatent)).Name); + + // Обращаемся к OData-сервису и обрабатываем ответ. + using (HttpResponseMessage response = args.HttpClient.GetAsync(requestUrl).Result) + { + // Убедимся, что запрос завершился успешно. + Assert.Equal(HttpStatusCode.OK, response.StatusCode); + + // Получим строку с ответом. + string receivedStr = response.Content.ReadAsStringAsync().Result.Beautify(); + + // Преобразуем полученный объект в словарь. + Dictionary receivedDict = JsonConvert.DeserializeObject>(receivedStr); + + Assert.Equal(1, ((JArray)receivedDict["value"]).Count); + Assert.Contains("@odata.type", receivedStr); + Assert.DoesNotContain("____", receivedStr); + } + }); + } + } +} diff --git a/Tests/NewPlatform.Flexberry.ORM.ODataService.Tests/CRUD/Read/MetaDataTest.cs b/Tests/NewPlatform.Flexberry.ORM.ODataService.Tests/CRUD/Read/MetaDataTest.cs index 3f388322..e90fbf41 100644 --- a/Tests/NewPlatform.Flexberry.ORM.ODataService.Tests/CRUD/Read/MetaDataTest.cs +++ b/Tests/NewPlatform.Flexberry.ORM.ODataService.Tests/CRUD/Read/MetaDataTest.cs @@ -98,6 +98,7 @@ public void GetFullMetadataTest() Assert.True(!string.IsNullOrEmpty(receivedData)); Assert.StartsWith("", receivedData); + Assert.DoesNotContain("____", receivedData); } }); } diff --git a/Tests/NewPlatform.Flexberry.ORM.ODataService.Tests/NewPlatform.Flexberry.ORM.ODataService.Tests.csproj b/Tests/NewPlatform.Flexberry.ORM.ODataService.Tests/NewPlatform.Flexberry.ORM.ODataService.Tests.csproj index ec8bcc03..e91c942a 100644 --- a/Tests/NewPlatform.Flexberry.ORM.ODataService.Tests/NewPlatform.Flexberry.ORM.ODataService.Tests.csproj +++ b/Tests/NewPlatform.Flexberry.ORM.ODataService.Tests/NewPlatform.Flexberry.ORM.ODataService.Tests.csproj @@ -40,9 +40,9 @@ - - - + + + diff --git a/Tests/Objects/BaseLegoBlock.cs b/Tests/Objects/BaseLegoBlock.cs index f293872f..c3c45511 100644 --- a/Tests/Objects/BaseLegoBlock.cs +++ b/Tests/Objects/BaseLegoBlock.cs @@ -39,12 +39,20 @@ public class BaseLegoBlock : ICSSoft.STORMNET.DataObject private NewPlatform.Flexberry.ORM.ODataService.Tests.LegoBlockColor fColor; private NewPlatform.Flexberry.ORM.ODataService.Tests.DetailArrayOfLegoPatent fPatents; - + // *** Start programmer edit section *** (BaseLegoBlock CustomMembers) + [NotStored] + public virtual string AssocType + { + get + { + return GetType().Name; + } + } // *** End programmer edit section *** (BaseLegoBlock CustomMembers) - + /// /// Name. /// diff --git a/Tests/Objects/LegoBlock.cs b/Tests/Objects/LegoBlock.cs index 655dcf7b..47d1db04 100644 --- a/Tests/Objects/LegoBlock.cs +++ b/Tests/Objects/LegoBlock.cs @@ -48,12 +48,22 @@ public class LegoBlock : NewPlatform.Flexberry.ORM.ODataService.Tests.BaseLegoBl private NewPlatform.Flexberry.ORM.ODataService.Tests.DetailArrayOfLegoBlockCustomPanel fCustomPanels; private NewPlatform.Flexberry.ORM.ODataService.Tests.DetailArrayOfLegoBlockTopPanel fTopPanels; - + // *** Start programmer edit section *** (LegoBlock CustomMembers) + [NotStored] + [DataServiceExpression(typeof(ICSSoft.STORMNET.Business.PostgresDataService), "'Association'")] + public override string AssocType + { + get + { + return base.AssocType; + } + } + // *** End programmer edit section *** (LegoBlock CustomMembers) - + /// /// Width. /// diff --git a/Tests/Objects/NewPlatform.Flexberry.ORM.ODataService.Tests.Objects.csproj b/Tests/Objects/NewPlatform.Flexberry.ORM.ODataService.Tests.Objects.csproj index c0fe08bd..7ae77c6e 100644 --- a/Tests/Objects/NewPlatform.Flexberry.ORM.ODataService.Tests.Objects.csproj +++ b/Tests/Objects/NewPlatform.Flexberry.ORM.ODataService.Tests.Objects.csproj @@ -14,10 +14,10 @@ - - - - + + + + all runtime; build; native; contentfiles; analyzers; buildtransitive diff --git "a/Tests/Objects/\320\234\320\265\320\264\320\262\320\265\320\264\321\214.cs" "b/Tests/Objects/\320\234\320\265\320\264\320\262\320\265\320\264\321\214.cs" index 48d23425..2f2b5414 100644 --- "a/Tests/Objects/\320\234\320\265\320\264\320\262\320\265\320\264\321\214.cs" +++ "b/Tests/Objects/\320\234\320\265\320\264\320\262\320\265\320\264\321\214.cs" @@ -326,6 +326,8 @@ public virtual ICSSoft.STORMNET.UserDataTypes.NullableDateTime ДатаРожд [StrLen(255)] [DataServiceExpression(typeof(ICSSoft.STORMNET.Business.MSSQLDataService), "\'ПорядковыйНомер:\' + @ПорядковыйНомер@ + \", Цвет глаз мамы:\" + isnull(@Мама.ЦветГ" + "лаз@,\'\')")] + [DataServiceExpression(typeof(ICSSoft.STORMNET.Business.PostgresDataService), "\'ПорядковыйНомер:\' || @ПорядковыйНомер@ || \", Цвет глаз мамы:\" || coalesce(@Мама.ЦветГ" + + "лаз@,\'\')")] public virtual string МедведьСтрокой { get