public void CustomizationEdmModelCreateTest()
        {
            ActODataService(args =>
            {
                var наследник = new Наследник()
                {
                    Свойство = 1234.5, Свойство1 = "str", Свойство2 = 22
                };
                var детейл = new Детейл()
                {
                    prop1 = 1
                };
                var детейл2 = new Детейл2()
                {
                    prop2 = "str2"
                };
                var мастер = new Мастер()
                {
                    prop = "str3"
                };
                var мастер2 = new Мастер2()
                {
                    свойство2 = -1
                };
                var master = new Master()
                {
                    property = "str4"
                };
                наследник.Master = master;
                наследник.Мастер = мастер;
                мастер.Мастер2   = мастер2;
                наследник.Детейл.Add(детейл);
                детейл.Детейл2.Add(детейл2);

                ExternalLangDef.LanguageDef.DataService = args.DataService;

                // ------------------ Только создания объектов ------------------
                // Подготовка тестовых данных в формате OData.
                var controller = new Controllers.DataObjectController(args.DataService, args.Token.Model, args.Token.Events, args.Token.Functions);
                System.Web.OData.EdmEntityObject edmObj = controller.GetEdmObject(args.Token.Model.GetEdmEntityType(typeof(Наследник)), наследник, 1, null);
                var edm_master  = controller.GetEdmObject(args.Token.Model.GetEdmEntityType(typeof(Master)), master, 1, null);
                var edm_мастер  = controller.GetEdmObject(args.Token.Model.GetEdmEntityType(typeof(Мастер)), мастер, 1, null);
                var edm_мастер2 = controller.GetEdmObject(args.Token.Model.GetEdmEntityType(typeof(Мастер2)), мастер2, 1, null);
                edmObj.TrySetPropertyValue("MasterAlias", edm_мастер);
                edmObj.TrySetPropertyValue("Master", edm_master);
                edm_мастер.TrySetPropertyValue("Master2Alias", edm_мастер2);
                var coll = controller.GetEdmCollection(наследник.Детейл, typeof(Детейл), 1, null);
                edmObj.TrySetPropertyValue("DetailAlias", coll);
                System.Web.OData.EdmEntityObject edmДетейл = (System.Web.OData.EdmEntityObject)coll[0];

                // Формируем URL запроса к OData-сервису.
                string requestUrl = string.Format("http://localhost/odata/{0}", args.Token.Model.GetEdmEntitySet(typeof(Наследник)).Name);

                // Обращаемся к OData-сервису и обрабатываем ответ, в теле запроса передаем создаваемый объект в формате JSON.
                HttpResponseMessage response = args.HttpClient.PostAsJsonAsync(requestUrl, edmObj).Result;

                // Убедимся, что запрос завершился успешно.
                Assert.Equal(HttpStatusCode.Created, response.StatusCode);
            });
        }
        public void CustomizationEdmModelReadTest()
        {
            ActODataService(args =>
            {
                var наследник = new Наследник()
                {
                    Свойство = 1234.5, Свойство1 = "str", Свойство2 = 22
                };
                var детейл = new Детейл()
                {
                    prop1 = 1
                };
                var детейл2 = new Детейл2()
                {
                    prop2 = "str2"
                };
                var мастер = new Мастер()
                {
                    prop = "str3"
                };
                var мастер2 = new Мастер2()
                {
                    свойство2 = -1
                };
                var master = new Master()
                {
                    property = "str4"
                };
                наследник.Master = master;
                наследник.Мастер = мастер;
                мастер.Мастер2   = мастер2;
                наследник.Детейл.Add(детейл);
                детейл.Детейл2.Add(детейл2);

                var objs = new DataObject[] { наследник };
                args.DataService.UpdateObjects(ref objs);
            });
        }
        public void PostNavigationPropertiesTest()
        {
            string[] детейлPropertiesNames =
            {
                Information.ExtractPropertyPath <Детейл>(x => x.prop1)
            };
            string[] masterPropertiesNames =
            {
                Information.ExtractPropertyPath <Master>(x => x.property)
            };
            string[] мастерPropertiesNames =
            {
                Information.ExtractPropertyPath <Мастер>(x => x.prop)
            };
            string[] мастер2PropertiesNames =
            {
                Information.ExtractPropertyPath <Мастер2>(x => x.свойство2)
            };
            string[] наследникPropertiesNames =
            {
                Information.ExtractPropertyPath <Наследник>(x => x.Свойство),
                Information.ExtractPropertyPath <Наследник>(x => x.Свойство1),
                Information.ExtractPropertyPath <Наследник>(x => x.Свойство2)
            };
            var детейлDynamicView    = new View(new ViewAttribute("детейлDynamicView", детейлPropertiesNames), typeof(Детейл));
            var masterDynamicView    = new View(new ViewAttribute("masterDynamicView", masterPropertiesNames), typeof(Master));
            var мастерDynamicView    = new View(new ViewAttribute("мастерDynamicView", мастерPropertiesNames), typeof(Мастер));
            var мастер2DynamicView   = new View(new ViewAttribute("мастер2DynamicView", мастер2PropertiesNames), typeof(Мастер2));
            var наследникDynamicView = new View(new ViewAttribute("наследникDynamicView", наследникPropertiesNames), typeof(Наследник));

            // Объекты для тестирования создания.
            var наследник = new Наследник()
            {
                Свойство = 1234.5, Свойство1 = "str", Свойство2 = 22
            };
            var детейл = new Детейл()
            {
                prop1 = 1
            };
            var мастер = new Мастер()
            {
                prop = "str3"
            };
            var мастер2 = new Мастер2()
            {
                свойство2 = -1
            };
            var master = new Master()
            {
                property = "str4"
            };

            наследник.Master = master;
            наследник.Мастер = мастер;
            мастер.Мастер2   = мастер2;
            наследник.Детейл.Add(детейл);
            ActODataService(args =>
            {
                string requestUrl;
                string receivedJsonMaster, receivedJsonМастер, receivedJsonНаследник;
                string requestJsonData = master.ToJson(masterDynamicView, args.Token.Model);
                requestUrl             = string.Format("http://localhost/odata/{0}", args.Token.Model.GetEdmEntitySet(typeof(Master)).Name);
                using (HttpResponseMessage response = args.HttpClient.PostAsJsonStringAsync(requestUrl, requestJsonData).Result)
                {
                    // Убедимся, что запрос завершился успешно.
                    Assert.Equal(HttpStatusCode.Created, response.StatusCode);

                    // Получим строку с ответом (в ней должна вернуться созданная сущность).
                    receivedJsonMaster = response.Content.ReadAsStringAsync().Result.Beautify();
                }

                requestJsonData = мастер.ToJson(мастерDynamicView, args.Token.Model);
                requestUrl      = string.Format("http://localhost/odata/{0}", args.Token.Model.GetEdmEntitySet(typeof(Мастер)).Name);
                using (HttpResponseMessage response = args.HttpClient.PostAsJsonStringAsync(requestUrl, requestJsonData).Result)
                {
                    // Убедимся, что запрос завершился успешно.
                    Assert.Equal(HttpStatusCode.Created, response.StatusCode);

                    // Получим строку с ответом (в ней должна вернуться созданная сущность).
                    receivedJsonМастер = response.Content.ReadAsStringAsync().Result.Beautify();
                }

                requestJsonData = наследник.ToJson(наследникDynamicView, args.Token.Model);
                DataObjectDictionary objJsonНаследник    = DataObjectDictionary.Parse(requestJsonData, наследникDynamicView, args.Token.Model);
                Dictionary <string, object> receivedDict = new JavaScriptSerializer().Deserialize <Dictionary <string, object> >(receivedJsonMaster);
                objJsonНаследник.Add("*****@*****.**", string.Format(
                                         "{0}({1})",
                                         args.Token.Model.GetEdmEntitySet(typeof(Master)).Name,
                                         receivedDict["__PrimaryKey"]));
                receivedDict = new JavaScriptSerializer().Deserialize <Dictionary <string, object> >(receivedJsonМастер);
                objJsonНаследник.Add("*****@*****.**", string.Format(
                                         "{0}({1})",
                                         args.Token.Model.GetEdmEntitySet(typeof(Мастер)).Name,
                                         receivedDict["__PrimaryKey"]));
                objJsonНаследник.Add("*****@*****.**", null);
                requestJsonData = objJsonНаследник.Serialize();
                requestUrl      = string.Format("http://localhost/odata/{0}", args.Token.Model.GetEdmEntitySet(typeof(Наследник)).Name);
                using (HttpResponseMessage response = args.HttpClient.PostAsJsonStringAsync(requestUrl, requestJsonData).Result)
                {
                    // Убедимся, что запрос завершился успешно.
                    Assert.Equal(HttpStatusCode.Created, response.StatusCode);

                    // Получим строку с ответом (в ней должна вернуться созданная сущность).
                    receivedJsonНаследник = response.Content.ReadAsStringAsync().Result.Beautify();
                }
            });
        }