public void LoadObjectsWithTop()
        {
            foreach (IDataService dataService in DataServices)
            {
                SQLDataService ds = (SQLDataService)dataService;

                try
                {
                    // Arrange.
                    // Сначала создаём структуру данных, требуемую для теста.
                    int top    = 2;
                    var forest = new Лес();
                    var bear1  = new Медведь()
                    {
                        ЛесОбитания = forest, ПорядковыйНомер = 2
                    };
                    var bear2 = new Медведь()
                    {
                        ЛесОбитания = forest, ПорядковыйНомер = 5
                    };
                    var bear3 = new Медведь()
                    {
                        ЛесОбитания = forest, ПорядковыйНомер = 8
                    };
                    var updateObjectsArray = new DataObject[] { forest, bear3, bear1, bear2 };

                    ds.UpdateObjects(ref updateObjectsArray);

                    var view = Медведь.Views.МедведьL;
                    var lcs  = LoadingCustomizationStruct.GetSimpleStruct(typeof(Медведь), view);
                    lcs.ReturnTop = top;

                    // Выведем в консоль запрос, который генерируется данной операцией.
                    ds.AfterGenerateSQLSelectQuery -= ds_AfterGenerateSQLSelectQuery;
                    ds.AfterGenerateSQLSelectQuery += ds_AfterGenerateSQLSelectQuery;

                    // Act.
                    var dataObjects = ds.LoadObjects(lcs);

                    // Assert.
                    Assert.Equal(top, dataObjects.Length);
                }
                catch (Exception)
                {
                    Debug.WriteLine("Тест запущен");
                    Debug.WriteLine(dataService.GetType().Name);
                    Debug.WriteLine(dataService.CustomizationString);
                    throw;
                }
                finally
                {
                    ds.AfterGenerateSQLSelectQuery -= ds_AfterGenerateSQLSelectQuery;
                }
            }
        }
Ejemplo n.º 2
0
        public void DeleteAgregatorWithoutDetailsThroughUpdateObjectsOrderedMethodTest()
        {
            foreach (IDataService dataService in DataServices)
            {
                SQLDataService ds = dataService as SQLDataService;

                // Создаем агрегатор без детейлов (медведя без берлог), но с бизнес-сервером привязанным к детейлам (к берлогам привязан бизнес-сервер).
                Медведь bear = new Медведь {
                    ЦветГлаз = "Карие", Вес = 50
                };
                DataObject[] dataObjectsForUpdate = new DataObject[]
                {
                    bear
                };

                // Сохраняем созданный агрегатор без детейлов.
                ds.UpdateObjects(ref dataObjectsForUpdate);

                // Помечаем сохраненный агрегатор на удаление.
                bear.SetStatus(ObjectStatus.Deleted);

                Exception updateException = null;
                try
                {
                    // Пытаемся удалить агрегатор через метод UpdateObjectsOrdered.
                    ds.UpdateObjectsOrdered(ref dataObjectsForUpdate);
                }
                catch (Exception ex)
                {
                    updateException = ex;
                }

                // Проверяем, что при удалении не возникло исключений.
                Assert.True(updateException == null, "При удалении через UpdateObjectsOrdered не возникло исключений");

                // Пытаемся загрузить удаленный объект из БД.
                Exception loadException = null;
                try
                {
                    Медведь loadedBear = new Медведь();
                    loadedBear.SetExistObjectPrimaryKey(bear.__PrimaryKey);
                    ds.LoadObject(loadedBear);
                }
                catch (Exception ex)
                {
                    loadException = ex;
                }

                // Проверяем, что удаленный объект действительно удалился.
                Assert.True(loadException is CantFindDataObjectException, "Объект удаленный через UpdateObjectsOrdered действительно больше не существует");
            }
        }
        /// <summary>
        /// OData function for delete all select records.
        /// </summary>
        /// <param name="queryParameters">Request OData Parameters.</param>
        /// <param name="pathName">Type name.</param>
        /// <param name="filterQuery">Query for filter.</param>
        /// <returns>Number of deleted records.</returns>
        private static object DeleteAllSelect(QueryParameters queryParameters, string pathName, string filterQuery)
        {
            try
            {
                SQLDataService dataService = DataServiceProvider.DataService as SQLDataService;

                var  uri  = $"http://a/b/c?{filterQuery}";
                Type type = queryParameters.GetDataObjectType(pathName);
                LoadingCustomizationStruct lcs = queryParameters.CreateLcs(type, uri);
                DataObject[] updateObjects     = dataService.LoadObjects(lcs);
                int          deletedCount      = updateObjects.Length;

                for (var i = 0; i < updateObjects.Length; i++)
                {
                    updateObjects[i].SetStatus(ObjectStatus.Deleted);
                }

                DataObject[] updateObjectsArray = updateObjects.ToArray();
                dataService.UpdateObjects(ref updateObjectsArray);

                return(new
                {
                    deletedCount,
                    message = string.Empty
                });
            }
            catch (Exception e)
            {
                Exception ex  = e;
                var       msg = ex.Message;
                while (ex.InnerException != null)
                {
                    ex   = ex.InnerException;
                    msg += Environment.NewLine + ex.Message;
                }

                return(new
                {
                    deletedCount = -1,
                    message = msg
                });
            }
        }
Ejemplo n.º 4
0
        public void GetDependenciesTest()
        {
            foreach (IDataService dataService in DataServices)
            {
                // Arrange
                SQLDataService ds = (SQLDataService)dataService;

                НаследникМ1 testDate = new НаследникМ1();
                testDate.Name = "test1";

                TestClassA testDate2 = new TestClassA();
                testDate2.Мастер = testDate;
                testDate2.Name   = "test2";

                var updateArray = new DataObject[]
                {
                    testDate2, testDate,
                };

                // Act.
                ds.UpdateObjects(ref updateArray);

                View view  = new View();
                View view2 = new View();

                view.DefineClassType  = typeof(НаследникМ1);
                view2.DefineClassType = typeof(TestClassA);

                view.AddProperty("Name");
                view2.AddProperty("Name");

                var lcs  = LoadingCustomizationStruct.GetSimpleStruct(typeof(НаследникМ1), view);
                var lcs2 = LoadingCustomizationStruct.GetSimpleStruct(typeof(TestClassA), view2);

                var resultDate  = ds.LoadObjects(lcs).Cast <НаследникМ1>().Select(x => x.Name).ToList();
                var resultDate2 = ds.LoadObjects(lcs2).Cast <TestClassA>().Select(x => x.Name).ToList();

                // Assert.
                Assert.Equal(testDate.Name, resultDate[0]);
                Assert.Equal(testDate2.Name, resultDate2[0]);
            }
        }
        public void TestMethod2()
        {
            foreach (IDataService dataService in DataServices)
            {
                SQLDataService ds = (SQLDataService)dataService;

                string[] props = new[]
                {
                    Information.ExtractPropertyPath <Лес>(x => x.Название),
                    Information.ExtractPropertyPath <Лес>(x => x.Площадь),
                    Information.ExtractPropertyPath <Лес>(x => x.Страна),
                    Information.ExtractPropertyPath <Лес>(x => x.Заповедник)
                };

                var view = new View();
                view.DefineClassType = typeof(Лес);
                foreach (string prop in props)
                {
                    view.AddProperty(prop);
                }

                // Чтобы в базе был подходящий лес, делаем его сами.
                var country = new Страна()
                {
                    Название = "РФ"
                };
                var forest = new Лес()
                {
                    Название = "Черняевский", Страна = country
                };
                var updateArray = new DataObject[] { country, forest };
                ds.UpdateObjects(ref updateArray);

                var лес = new Лес();
                лес.SetExistObjectPrimaryKey(forest.__PrimaryKey);

                ds.LoadObject(view, лес, false, false);

                Assert.Equal(country.__PrimaryKey, лес.Страна.__PrimaryKey);
            }
        }
Ejemplo n.º 6
0
        public void DeleteAggregatorWithManyDetailsTest()
        {
            foreach (IDataService dataService in DataServices)
            {
                // Arrange.
                SQLDataService ds = dataService as SQLDataService;

                //TODO: Fix OracleDataService error.
                if (dataService is OracleDataService)
                {
                    continue;
                }

                var masterCl = new Пользователь {
                    ФИО = "фио"
                };
                var aggregator = new Конкурс {
                    Название = "название", Организатор = masterCl
                };

                var detailOne = new КритерийОценки {
                    ПорядковыйНомер = 4
                };
                var detailTwo = new ДокументацияККонкурсу {
                    Файл = new WebFile()
                };
                aggregator.КритерииОценки.Add(detailOne);
                aggregator.Документы.Add(detailTwo);

                ds.UpdateObject(aggregator);

                // Act
                LoadingCustomizationStruct lcsAggregator = LoadingCustomizationStruct.GetSimpleStruct(typeof(Конкурс), Конкурс.Views.КонкурсE);
                LoadingCustomizationStruct lcsDetailOne  = LoadingCustomizationStruct.GetSimpleStruct(typeof(КритерийОценки), КритерийОценки.Views.КритерийОценкиE);
                LoadingCustomizationStruct lcsDetailTwo  = LoadingCustomizationStruct.GetSimpleStruct(typeof(ДокументацияККонкурсу), ДокументацияККонкурсу.Views.ДокументацияККонкурсуE);

                DataObject[] dataObjectsAggregator = ds.LoadObjects(lcsAggregator);
                DataObject[] dataObjectsDetailOne  = ds.LoadObjects(lcsDetailOne);
                DataObject[] dataObjectsDetailTwo  = ds.LoadObjects(lcsDetailTwo);

                int countAggregatorBefore = ds.GetObjectsCount(lcsAggregator);
                int countDetailOneBefore  = ds.GetObjectsCount(lcsDetailOne);
                int countDetailTwoBefore  = ds.GetObjectsCount(lcsDetailTwo);

                List <DataObject> objectsForUpdateList = new List <DataObject>();

                foreach (Конкурс конкурс in dataObjectsAggregator)
                {
                    конкурс.SetStatus(ObjectStatus.Deleted);
                    objectsForUpdateList.Add(конкурс);
                }

                foreach (КритерийОценки критерий in dataObjectsDetailOne)
                {
                    критерий.SetStatus(ObjectStatus.Deleted);
                    objectsForUpdateList.Add(критерий);
                }

                foreach (ДокументацияККонкурсу документ in dataObjectsDetailTwo)
                {
                    документ.SetStatus(ObjectStatus.Deleted);
                    objectsForUpdateList.Add(документ);
                }

                DataObject[] objectsForUpdate = objectsForUpdateList.ToArray();

                ds.UpdateObjects(ref objectsForUpdate);

                int countAggregatorAfter = ds.GetObjectsCount(lcsAggregator);
                int countDetailOneAfter  = ds.GetObjectsCount(lcsDetailOne);
                int countDetailTwoAfter  = ds.GetObjectsCount(lcsDetailTwo);

                // Assert
                Assert.Equal(1, countAggregatorBefore);
                Assert.Equal(1, countDetailOneBefore);
                Assert.Equal(1, countDetailTwoBefore);

                Assert.Equal(0, countAggregatorAfter);
                Assert.Equal(0, countDetailOneAfter);
                Assert.Equal(0, countDetailTwoAfter);
            }
        }
Ejemplo n.º 7
0
        public void DeleteAggregatorWithDetailAndHierarhiTest()
        {
            foreach (IDataService dataService in DataServices)
            {
                // Arrange.
                SQLDataService ds = dataService as SQLDataService;

                //TODO: Fix OracleDataService error.
                if (dataService is OracleDataService)
                {
                    continue;
                }

                var masterForest = new Лес {
                    Название = "лес1"
                };
                var detailDen = new Берлога {
                    Наименование = "берлога1", ЛесРасположения = masterForest
                };
                var aggregatorBear = new Медведь {
                    ПорядковыйНомер = 2, ЛесОбитания = masterForest
                };
                aggregatorBear.Берлога.Add(detailDen);

                ds.UpdateObject(aggregatorBear);

                var aggregatorBearMother = new Медведь {
                    ПорядковыйНомер = 2
                };
                aggregatorBear.Мама = aggregatorBearMother;

                ds.UpdateObject(aggregatorBear);

                // Act & Assert.
                LoadingCustomizationStruct lcsBear   = LoadingCustomizationStruct.GetSimpleStruct(typeof(Медведь), Медведь.Views.МедведьE);
                LoadingCustomizationStruct lcsForest = LoadingCustomizationStruct.GetSimpleStruct(typeof(Лес), Лес.Views.ЛесE);

                DataObject[] dataObjectsBear   = ds.LoadObjects(lcsBear);
                DataObject[] dataObjectsForest = ds.LoadObjects(lcsForest);

                // Act
                int countBearBefore   = ds.GetObjectsCount(lcsBear);
                int countForestBefore = ds.GetObjectsCount(lcsForest);

                List <DataObject> objectsForUpdateList = new List <DataObject>();

                foreach (Медведь медведь in dataObjectsBear)
                {
                    медведь.SetStatus(ObjectStatus.Deleted);
                    objectsForUpdateList.Add(медведь);
                }

                foreach (Лес лес in dataObjectsForest)
                {
                    лес.SetStatus(ObjectStatus.Deleted);
                    objectsForUpdateList.Add(лес);
                }

                DataObject[] objectsForUpdate = objectsForUpdateList.ToArray();

                ds.UpdateObjects(ref objectsForUpdate);

                int countBearAfter   = ds.GetObjectsCount(lcsBear);
                int countForestAfter = ds.GetObjectsCount(lcsForest);

                // Assert
                Assert.Equal(2, countBearBefore);
                Assert.Equal(1, countForestBefore);

                Assert.Equal(0, countBearAfter);
                Assert.Equal(0, countForestAfter);
            }
        }
Ejemplo n.º 8
0
        public void DeleteUpdateAssociationTest()
        {
            foreach (IDataService dataService in DataServices)
            {
                // Arrange.
                SQLDataService ds = dataService as SQLDataService;

                //TODO: Fix OracleDataService error.
                if (dataService is OracleDataService)
                {
                    continue;
                }
                var masterBreedType = new ТипПороды {
                    Название = "тип породы1", ДатаРегистрации = DateTime.Now
                };
                var innerMasterBreed = new Порода {
                    Название = "порода1", ТипПороды = masterBreedType
                };
                var innerMasterCat = new Кошка
                {
                    Кличка       = "кошка",
                    ДатаРождения = (NullableDateTime)DateTime.Now,
                    Тип          = ТипКошки.Дикая,
                    Порода       = innerMasterBreed
                };
                var innerKitten = new Котенок {
                    КличкаКотенка = "котеночек", Кошка = innerMasterCat
                };

                // Act
                ds.UpdateObject(innerKitten);

                LoadingCustomizationStruct lcsKitten    = LoadingCustomizationStruct.GetSimpleStruct(typeof(Котенок), Котенок.Views.КотенокE);
                LoadingCustomizationStruct lcsCat       = LoadingCustomizationStruct.GetSimpleStruct(typeof(Кошка), Кошка.Views.КошкаE);
                LoadingCustomizationStruct lcsBreed     = LoadingCustomizationStruct.GetSimpleStruct(typeof(Порода), Порода.Views.ПородаE);
                LoadingCustomizationStruct lcsBreedType = LoadingCustomizationStruct.GetSimpleStruct(typeof(ТипПороды), ТипПороды.Views.ТипПородыE);

                DataObject[] dataObjectsKitten     = ds.LoadObjects(lcsKitten);
                DataObject[] dataObjectsCats       = ds.LoadObjects(lcsCat);
                DataObject[] dataObjectsBreed      = ds.LoadObjects(lcsBreed);
                DataObject[] dataObjectsBreedTypes = ds.LoadObjects(lcsBreedType);

                int countKittenBefore    = ds.GetObjectsCount(lcsKitten);
                int countCatBefore       = ds.GetObjectsCount(lcsCat);
                int countBreedBefore     = ds.GetObjectsCount(lcsBreed);
                int countBreedTypeBefore = ds.GetObjectsCount(lcsBreed);

                List <DataObject> objectsForUpdateList = new List <DataObject>();

                foreach (Котенок котенок in dataObjectsKitten)
                {
                    котенок.SetStatus(ObjectStatus.Deleted);
                    objectsForUpdateList.Add(котенок);
                }

                foreach (Кошка кошка in dataObjectsCats)
                {
                    кошка.SetStatus(ObjectStatus.Deleted);
                    objectsForUpdateList.Add(кошка);
                }

                foreach (Порода порода in dataObjectsBreed)
                {
                    порода.SetStatus(ObjectStatus.Deleted);
                    objectsForUpdateList.Add(порода);
                }

                foreach (ТипПороды типПороды in dataObjectsBreedTypes)
                {
                    типПороды.SetStatus(ObjectStatus.Deleted);
                    objectsForUpdateList.Add(типПороды);
                }

                DataObject[] objectsForUpdate = objectsForUpdateList.ToArray();

                ds.UpdateObjects(ref objectsForUpdate);

                int countKittenAfter    = ds.GetObjectsCount(lcsKitten);
                int countCatAfter       = ds.GetObjectsCount(lcsCat);
                int countBreedAfter     = ds.GetObjectsCount(lcsBreed);
                int countBreedTypeAfter = ds.GetObjectsCount(lcsBreedType);

                // Assert
                Assert.Equal(1, countKittenBefore);
                Assert.Equal(1, countCatBefore);
                Assert.Equal(1, countBreedBefore);
                Assert.Equal(1, countBreedTypeBefore);

                Assert.Equal(0, countKittenAfter);
                Assert.Equal(0, countCatAfter);
                Assert.Equal(0, countBreedAfter);
                Assert.Equal(0, countBreedTypeAfter);
            }
        }
Ejemplo n.º 9
0
        public void DetailsDeleteTest()
        {
            foreach (IDataService dataService in DataServices)
            {
                // Arrange
                SQLDataService ds = (SQLDataService)dataService;

                const string First  = "Первый";
                const string Second = "Второй";
                const string Third  = "Третий";
                const string Fourth = "Четвертый";

                ТипЛапы передняяЛапа = new ТипЛапы {
                    Актуально = true, Название = "Передняя"
                };
                ТипЛапы задняяЛапа = new ТипЛапы {
                    Актуально = true, Название = "Задняя"
                };


                Кошка aggregator = new Кошка
                {
                    ДатаРождения = (NullableDateTime)DateTime.Now,
                    Тип          = ТипКошки.Дикая,
                    Порода       = new Порода {
                        Название = "Чеширская"
                    },
                    Кличка = "Мурка"
                };
                aggregator.Лапа.AddRange(
                    new Лапа {
                    Цвет = First, ТипЛапы = передняяЛапа
                },
                    new Лапа {
                    Цвет = Second, ТипЛапы = передняяЛапа
                },
                    new Лапа {
                    Цвет = Third, ТипЛапы = задняяЛапа
                },
                    new Лапа {
                    Цвет = Fourth, ТипЛапы = задняяЛапа
                });

                ds.UpdateObject(aggregator);

                LoadingCustomizationStruct lcsCat      = LoadingCustomizationStruct.GetSimpleStruct(typeof(Кошка), Кошка.Views.КошкаE);
                LoadingCustomizationStruct lcsPaws     = LoadingCustomizationStruct.GetSimpleStruct(typeof(Лапа), Лапа.Views.ЛапаFull);
                LoadingCustomizationStruct lcsPawsType = LoadingCustomizationStruct.GetSimpleStruct(typeof(ТипЛапы), ТипЛапы.Views.ТипЛапыE);

                DataObject[] dataObjectsCats      = ds.LoadObjects(lcsCat);
                DataObject[] dataObjectsPawsTypes = ds.LoadObjects(lcsPawsType);

                // Act
                int countCatBefore      = ds.GetObjectsCount(lcsCat);
                int countPawsBefore     = ds.GetObjectsCount(lcsPaws);
                int countPawsTypeBefore = ds.GetObjectsCount(lcsPawsType);

                List <DataObject> objectsForUpdateList = new List <DataObject>();

                foreach (Кошка кошка in dataObjectsCats)
                {
                    кошка.SetStatus(ObjectStatus.Deleted);
                    objectsForUpdateList.Add(кошка);
                }

                foreach (ТипЛапы типЛапы in dataObjectsPawsTypes)
                {
                    типЛапы.SetStatus(ObjectStatus.Deleted);
                    objectsForUpdateList.Add(типЛапы);
                }

                DataObject[] objectsForUpdate = objectsForUpdateList.ToArray();

                ds.UpdateObjects(ref objectsForUpdate);

                int countCatAfter      = ds.GetObjectsCount(lcsCat);
                int countPawsAfter     = ds.GetObjectsCount(lcsPaws);
                int countPawsTypeAfter = ds.GetObjectsCount(lcsPawsType);

                // Assert
                Assert.Equal(1, countCatBefore);
                Assert.Equal(4, countPawsBefore);
                Assert.Equal(2, countPawsTypeBefore);

                Assert.Equal(0, countCatAfter);
                Assert.Equal(0, countPawsAfter);
                Assert.Equal(0, countPawsTypeAfter);
            }
        }
Ejemplo n.º 10
0
        public void GetObjectIndexesWithPksOrderingTest()
        {
            foreach (IDataService dataService in DataServices)
            {
                //TODO: Fix OracleDataService error.
                if (dataService is OracleDataService)
                {
                    continue;
                }
                // Arrange.
                SQLDataService      ds      = dataService as SQLDataService;
                SQLWhereLanguageDef langDef = SQLWhereLanguageDef.LanguageDef;

                List <DataObject> dataObjects = new List <DataObject>();
                bool isMssql = dataService.GetType() == typeof(MSSQLDataService) || dataService.GetType().IsSubclassOf(typeof(MSSQLDataService));

                // MSSQL в отличие от других хранилищ имеет свой формат сортировки гуидов. Для его поддержки приходится пользоваться специальным типом SqlGuid.
                List <SqlGuid> keysMssqlList    = new List <SqlGuid>();
                List <Guid>    keysPostgresList = new List <Guid>();

                // Создадим 1000 медведей.
                int objectsCount = 1000;
                for (int i = 0; i < objectsCount; i++)
                {
                    // Для простоты анализа проблем с данными, если они возникнут, выдадим ненастоящие последовательные гуиды.
                    byte[] bytes = new byte[16];
                    BitConverter.GetBytes(i).CopyTo(bytes, 0);
                    var pk = new Guid(bytes);
                    if (isMssql)
                    {
                        keysMssqlList.Add(pk);
                    }
                    else
                    {
                        keysPostgresList.Add(pk);
                    }

                    var createdBear = new Медведь
                    {
                        __PrimaryKey = pk,
                        ЦветГлаз     = "Косолапый Мишка " + i,
                        Вес          = i
                    };
                    dataObjects.Add(createdBear);
                }

                DataObject[] dataObjectsForUpdate = dataObjects.ToArray();
                ds.UpdateObjects(ref dataObjectsForUpdate);

                LoadingCustomizationStruct lcs = LoadingCustomizationStruct.GetSimpleStruct(typeof(Медведь), Медведь.Views.МедведьL);

                Function findFunction = langDef.GetFunction(langDef.funcL, new VariableDef(langDef.StringType, Information.ExtractPropertyPath <Медведь>(m => m.Вес)), objectsCount);
                if (isMssql)
                {
                    keysMssqlList.Sort();
                }
                else
                {
                    keysPostgresList.Sort();
                }

                // Act.
                IDictionary <int, string> result = ds.GetObjectIndexesWithPks(lcs, findFunction, null);

                // Assert.
                var values = result.Values.GetEnumerator();
                var keys   = result.Keys.GetEnumerator();

                for (int i = 0; i < objectsCount; i++)
                {
                    Assert.Equal(objectsCount, result.Count);

                    values.MoveNext();
                    keys.MoveNext();
                    string key = isMssql ? ((Guid)keysMssqlList[i]).ToString("B") : keysPostgresList[i].ToString("B");
                    Assert.Equal(key, values.Current);
                    Assert.Equal(i + 1, keys.Current);
                }
            }
        }
Ejemplo n.º 11
0
        public void DeleteAggregatorWithManyDetailsAndAssociationTest()
        {
            foreach (IDataService dataService in DataServices)
            {
                // Arrange.
                SQLDataService ds = dataService as SQLDataService;

                //TODO: Fix OracleDataService error.
                if (dataService is OracleDataService)
                {
                    continue;
                }

                var пользователь = new Пользователь {
                    ФИО = "фио"
                };
                var критерийОценки = new КритерийОценки {
                    ПорядковыйНомер = 4
                };
                var конкурс = new Конкурс {
                    Название = "название", Организатор = пользователь
                };
                конкурс.КритерииОценки.Add(критерийОценки);
                var aggregatorIdea = new Идея {
                    Заголовок = "агрегатор1", Автор = пользователь, Конкурс = конкурс
                };
                aggregatorIdea.Файлы.Add(new ФайлИдеи {
                    Владелец = пользователь
                });
                var masterAndDetail = new ЗначениеКритерия {
                    Значение = "значение1", Критерий = критерийОценки
                };
                aggregatorIdea.ОценкиЭкспертов.Add(new ОценкаЭксперта {
                    ЗначениеОценки = 2, ЗначениеКритерия = masterAndDetail, Эксперт = пользователь
                });
                aggregatorIdea.ЗначенияКритериев.Add(masterAndDetail);

                ds.UpdateObject(aggregatorIdea);

                // Act & Assert.
                LoadingCustomizationStruct lcsAggregator = LoadingCustomizationStruct.GetSimpleStruct(typeof(Идея), Идея.Views.ИдеяE);
                LoadingCustomizationStruct lcsDetail1    = LoadingCustomizationStruct.GetSimpleStruct(typeof(ФайлИдеи), ФайлИдеи.Views.ФайлE);
                LoadingCustomizationStruct lcsDetail2    = LoadingCustomizationStruct.GetSimpleStruct(typeof(ОценкаЭксперта), ОценкаЭксперта.Views.ОценкаЭкспертаE);
                LoadingCustomizationStruct lcsDetail3    = LoadingCustomizationStruct.GetSimpleStruct(typeof(ЗначениеКритерия), ЗначениеКритерия.Views.ЗначениеКритерияE);

                DataObject[] dataObjectsAggregator = ds.LoadObjects(lcsAggregator);
                DataObject[] dataObjectsDetail1    = ds.LoadObjects(lcsDetail1);
                DataObject[] dataObjectsDetail2    = ds.LoadObjects(lcsDetail2);
                DataObject[] dataObjectsDetail3    = ds.LoadObjects(lcsDetail3);

                // Act
                int countAggregatorBefore = ds.GetObjectsCount(lcsAggregator);
                int countDetail1Before    = ds.GetObjectsCount(lcsDetail1);
                int countDetail2Before    = ds.GetObjectsCount(lcsDetail2);
                int countDetail3Before    = ds.GetObjectsCount(lcsDetail3);

                List <DataObject> objectsForUpdateList = new List <DataObject>();

                foreach (Идея идея in dataObjectsAggregator)
                {
                    идея.SetStatus(ObjectStatus.Deleted);
                    objectsForUpdateList.Add(идея);
                }

                foreach (ФайлИдеи файл in dataObjectsDetail1)
                {
                    файл.SetStatus(ObjectStatus.Deleted);
                    objectsForUpdateList.Add(файл);
                }

                foreach (ОценкаЭксперта оценка in dataObjectsDetail2)
                {
                    оценка.SetStatus(ObjectStatus.Deleted);
                    objectsForUpdateList.Add(оценка);
                }

                foreach (ЗначениеКритерия критерий in dataObjectsDetail3)
                {
                    критерий.SetStatus(ObjectStatus.Deleted);
                    objectsForUpdateList.Add(критерий);
                }

                DataObject[] objectsForUpdate = objectsForUpdateList.ToArray();

                ds.UpdateObjects(ref objectsForUpdate);

                int countAggregatorAfter = ds.GetObjectsCount(lcsAggregator);
                int countDetail1After    = ds.GetObjectsCount(lcsDetail1);
                int countDetail2After    = ds.GetObjectsCount(lcsDetail2);
                int countDetail3After    = ds.GetObjectsCount(lcsDetail3);

                // Assert
                Assert.Equal(1, countAggregatorBefore);
                Assert.Equal(1, countDetail1Before);
                Assert.Equal(1, countDetail2Before);
                Assert.Equal(1, countDetail3Before);

                Assert.Equal(0, countAggregatorAfter);
                Assert.Equal(0, countDetail1After);
                Assert.Equal(0, countDetail2After);
                Assert.Equal(0, countDetail3After);
            }
        }