From 73ac846ce59a5413f7a8425f5e5195af24de7dcd Mon Sep 17 00:00:00 2001 From: inaidanov Date: Wed, 20 Mar 2024 15:59:30 +0500 Subject: [PATCH] =?UTF-8?q?=D0=98=D1=81=D0=BF=D1=80=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=D0=B8=D1=8F=20=D0=B7=D0=B0=D0=BC=D0=B5=D1=87=D0=B0?= =?UTF-8?q?=D0=BD=D0=B8=D0=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CHANGELOG.md | 1 + .../DataObjectController.ModifyData.cs | 24 ++++++++++++------- .../Extensions/DataServiceExtensions.cs | 2 +- 3 files changed, 17 insertions(+), 10 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index a62c646e..714342e8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,7 @@ This project adheres to [Semantic Versioning](http://semver.org/). ### Added 1. `updateViews` parameter of `DefaultDataObjectEdmModelBuilder` class. It allows to change update views for data objects (update view is used for loading a data object during OData update requests). +2. `masterLightLoadTypes` and `masterLightLoadAllTypes` parameters of `DefaultDataObjectEdmModelBuilder` class. They allow to change loading mode of masters during OData update requests. ### Changed 1. Updated Flexberry ORM up to 7.2.0-beta01. diff --git a/NewPlatform.Flexberry.ORM.ODataService/Controllers/DataObjectController.ModifyData.cs b/NewPlatform.Flexberry.ORM.ODataService/Controllers/DataObjectController.ModifyData.cs index bc17d0e4..802206c5 100644 --- a/NewPlatform.Flexberry.ORM.ODataService/Controllers/DataObjectController.ModifyData.cs +++ b/NewPlatform.Flexberry.ORM.ODataService/Controllers/DataObjectController.ModifyData.cs @@ -776,7 +776,7 @@ private DataObject ReturnDataObject(Type objType, object keyValue, View view) IEnumerable ownProps = view.Properties.Where(p => !p.Name.Contains('.')); if (!ownProps.All(p => loadedProps.Contains(p.Name))) { - // Вычитывать объект сразу с детейлами нельзя, поскольку в этой же транзакции могут уже оказать отдельные операции с детейлами и перевычитка затрёт эти изменения. + // Вычитывать объект сразу с детейлами нельзя, поскольку в этой же транзакции могут уже оказаться отдельные операции с детейлами и перевычитка затрёт эти изменения. View miniView = view.Clone(); DetailInView[] miniViewDetails = miniView.Details; miniView.Details = new DetailInView[0]; @@ -792,7 +792,7 @@ private DataObject ReturnDataObject(Type objType, object keyValue, View view) return dataObjectFromCache; } - // Вычитывать объект сразу с детейлами нельзя, поскольку в этой же транзакции могут уже оказать отдельные операции с детейлами и перевычитка затрёт эти изменения. + // Вычитывать объект сразу с детейлами нельзя, поскольку в этой же транзакции могут уже оказаться отдельные операции с детейлами и перевычитка затрёт эти изменения. View lightView = view.Clone(); DetailInView[] lightViewDetails = lightView.Details; lightView.Details = new DetailInView[0]; @@ -860,9 +860,9 @@ private static void AddObjectToUpdate(List objsToUpdate, DataObject /// Значение ключа. private object GetKey(EdmEntityObject edmEntity) { - if (edmEntity == null) + if (edmEntity == null) { - throw new ArgumentNullException(nameof(value), $"{nameof(edmEntity)} can not be null."); + throw new ArgumentNullException(nameof(edmEntity), $"{nameof(edmEntity)} can not be null."); } object key; @@ -883,9 +883,9 @@ private object GetKey(EdmEntityObject edmEntity) /// Объект данных. private DataObject GetDataObjectByEdmEntityLight(EdmEntityObject edmEntity) { - if (edmEntity == null) + if (edmEntity == null) { - throw new ArgumentNullException(nameof(value), $"{nameof(edmEntity)} can not be null."); + throw new ArgumentNullException(nameof(edmEntity), $"{nameof(edmEntity)} can not be null."); } var masterType = _model.GetDataObjectType(edmEntity); @@ -945,9 +945,6 @@ private DataObject GetDataObjectByEdmEntity(EdmEntityObject edmEntity, object ke .ToList(); foreach (var prop in changedProps) { - object value; - edmEntity.TryGetPropertyValue(prop.Name, out value); - string dataObjectPropName; try { @@ -972,6 +969,9 @@ private DataObject GetDataObjectByEdmEntity(EdmEntityObject edmEntity, object ke // Обработка мастеров. if (edmMultiplicity == EdmMultiplicity.One || edmMultiplicity == EdmMultiplicity.ZeroOrOne) { + object value; + edmEntity.TryGetPropertyValue(prop.Name, out value); + if (value is EdmEntityObject edmMaster) { // Порядок вставки влияет на порядок отправки объектов в UpdateObjects это в свою очередь влияет на то, как срабатывают бизнес-серверы. Бизнес-сервер мастера должен сработать после, а агрегатора перед этим объектом. @@ -1017,6 +1017,9 @@ private DataObject GetDataObjectByEdmEntity(EdmEntityObject edmEntity, object ke { DetailArray detarr = (DetailArray)Information.GetPropValueByName(obj, dataObjectPropName); + object value; + edmEntity.TryGetPropertyValue(prop.Name, out value); + if (value is EdmEntityObjectCollection coll) { if (coll != null && coll.Count > 0) @@ -1052,6 +1055,9 @@ private DataObject GetDataObjectByEdmEntity(EdmEntityObject edmEntity, object ke // Обработка собственных свойств объекта (неключевых, т.к. ключ устанавливаем при начальной инициализации объекта obj). if (prop.Name != _model.KeyPropertyName) { + object value; + edmEntity.TryGetPropertyValue(prop.Name, out value); + Type dataObjectPropertyType = Information.GetPropertyType(objType, dataObjectPropName); // Если тип свойства относится к одному из зарегистрированных провайдеров файловых свойств, diff --git a/NewPlatform.Flexberry.ORM.ODataService/Extensions/DataServiceExtensions.cs b/NewPlatform.Flexberry.ORM.ODataService/Extensions/DataServiceExtensions.cs index a299aa6c..b7639b38 100644 --- a/NewPlatform.Flexberry.ORM.ODataService/Extensions/DataServiceExtensions.cs +++ b/NewPlatform.Flexberry.ORM.ODataService/Extensions/DataServiceExtensions.cs @@ -245,7 +245,7 @@ public static void SafeLoadObject(this IDataService dataService, DataObject data throw new ArgumentNullException(nameof(view)); } - // Вычитывать объект сразу с детейлами нельзя, поскольку в этой же транзакции могут уже оказать отдельные операции с детейлами и перевычитка затрёт эти изменения. + // Вычитывать объект сразу с детейлами нельзя, поскольку в этой же транзакции могут уже оказаться отдельные операции с детейлами и перевычитка затрёт эти изменения. View miniView = view.Clone(); DetailInView[] miniViewDetails = miniView.Details; miniView.Details = new DetailInView[0];