Форум программистов, компьютерный форум, киберфорум
C#: Базы данных
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.80/15: Рейтинг темы: голосов - 15, средняя оценка - 4.80
 Аватар для 6elka1703
91 / 85 / 27
Регистрация: 29.10.2016
Сообщений: 928

Entity framework Хранимые процедуры

21.01.2022, 01:27. Показов 3308. Ответов 59
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Привет всем, подскажите один момент
у меня есть сущность Заказчик
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public class Customer
    {
        public int Id { get; set; }
 
        [Required(ErrorMessage = "Заполните наименование компании")]
        [Display(Name = "Наименование")]
        public string Name { get; set; }
 
        [Required(ErrorMessage = "Заполните юридический адрес")]
        [Display(Name = "Юридический адрес")]
        public string Address { get; set; }
 
        [NotMapped]
        public int CountProjects { get; set; }
 
        [NotMapped]
        public int CountEndProjects { get; set; }
        
    }
}
и сущность Проект

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
public class Project
    {
        public int Id { get; set; }
 
        [Required(ErrorMessage = "Заполните наименование проекта")]
        [Display(Name = "Наименование")]
        public string Name { get; set; }
 
        [DataType(DataType.Date)]
        [Required(ErrorMessage = "Заполните дату начала проекта")]
        [Display(Name = "Дата начала проекта")]
        public DateTime DateStart { get; set; }
 
        [DataType(DataType.Date)]
        [Required(ErrorMessage = "Заполните планируемую дату завершения проекта")]
        [Display(Name = "Планируемая дата завершения проекта")]
        public DateTime DateEndPlan { get; set; }
 
        [DataType(DataType.Date)]
        [Display(Name = "Фактическая дата завершения проекта")]
        public DateTime DateEndFact { get; set; }
 
        [Required(ErrorMessage = "Заполните фамилию и инициалы менеджера")]
        [Display(Name = "Фамилия И.О. менеджера проекта")]
        public string ManagerName { get; set; }
 
        [Required(ErrorMessage = "Укажите закачкика проекта")]
        [Display(Name = "Заказчки")]
        public int CustomerId { get; set; }
 
        public Customer Customer { get; set; }
    }
и мне нужно получить данные из двух таблиц, для этого создал хранимую процедуру
SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
CREATE PROCEDURE [dbo].[GetCustomers]
AS
    SELECT 
    Customers.Id,
    Customers.Name, 
    Customers.Address,  
    COUNT(Projects.CustomerId) AS CountProjects,
    SUM(CASE
        WHEN Projects.DateEndFact IS NULL
        THEN 0
        ELSE 1
    END) AS CountEndProjects
    FROM Customers LEFT OUTER JOIN Projects
    ON Customers.Id = Projects.CustomerId
    GROUP BY Projects.CustomerId, Customers.Id, Customers.Name, Customers.Address
вызываю ее так

C#
1
var customers = context.Customers.FromSqlRaw("GetCustomers");
но почему то поля CountProjects и CountEndProjects приходят пустые с нулем. Хотя если процедуру выполнить на sql то запрос возвращает данные как надо.
Что сделал не так?
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
21.01.2022, 01:27
Ответы с готовыми решениями:

Как правильно обновить хранимые процедуры в Entity Framework?
День добрый. Подскажите пожалуйста как правильно обновить хранимые процедуры в проекте после изменения их в бд. Если изменить (в Managment...

В чем разница между Entity Framework и Entity Framework Core?
В чем разница (если она есть) между entity framework и entity framework core?

Entity Framework. Удаление entity без удаления связей
Вечер добрый. Есть модель Coder First. Каскадное удаление запрещено. Удаление произвожу так: try { ...

59
 Аватар для 6elka1703
91 / 85 / 27
Регистрация: 29.10.2016
Сообщений: 928
21.01.2022, 12:03  [ТС]
Студворк — интернет-сервис помощи студентам
Andrey-MSK,
Цитата Сообщение от Andrey-MSK Посмотреть сообщение
В классе данных должно быть навигационное свойство на вторую таблицу и объявлен ForeignKey во второй таблице. Тогда вы сможете джойнить таблицы в запросе EF и получать связанные коллекции из второй таблицы.
Так и сделал, в классе project есть ForeignKey

C#
1
2
public int CustomerId { get; set; }
public Customer Customer { get; set; }
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
public class Project
    {
        public int Id { get; set; }
 
        [Required(ErrorMessage = "Заполните наименование проекта")]
        [Display(Name = "Наименование")]
        public string Name { get; set; }
 
        [DataType(DataType.Date)]
        [Required(ErrorMessage = "Заполните дату начала проекта")]
        [Display(Name = "Дата начала проекта")]
        public DateTime DateStart { get; set; }
 
        [DataType(DataType.Date)]
        [Required(ErrorMessage = "Заполните планируемую дату завершения проекта")]
        [Display(Name = "Планируемая дата завершения проекта")]
        public DateTime DateEndPlan { get; set; }
 
        [DataType(DataType.Date)]
        [Display(Name = "Фактическая дата завершения проекта")]
        public DateTime DateEndFact { get; set; }
 
        [Required(ErrorMessage = "Заполните фамилию и инициалы менеджера")]
        [Display(Name = "Фамилия И.О. менеджера проекта")]
        public string ManagerName { get; set; }
 
        [Required(ErrorMessage = "Укажите закачкика проекта")]
        [Display(Name = "Заказчки")]
        public int CustomerId { get; set; }
 
        public Customer Customer { get; set; }
Добавлено через 1 минуту
Andrey-MSK,
только не понимаю, зачем в классе хранить коллекцию подчиненной таблицы?
C#
1
public ICollection<DrawSystem> DrawSystems { get; set; }
0
 Аватар для Andrey-MSK
3376 / 2262 / 388
Регистрация: 14.08.2018
Сообщений: 7,671
Записей в блоге: 4
21.01.2022, 12:06
Цитата Сообщение от 6elka1703 Посмотреть сообщение
только не понимаю, зачем в классе хранить коллекцию подчиненной таблицы?
Загрузка связанных данных
1
 Аватар для 6elka1703
91 / 85 / 27
Регистрация: 29.10.2016
Сообщений: 928
21.01.2022, 12:12  [ТС]
Andrey-MSK, почитаю про загрузку связанных данных. спасибо.
0
 Аватар для 6elka1703
91 / 85 / 27
Регистрация: 29.10.2016
Сообщений: 928
22.01.2022, 16:23  [ТС]
Подскажите пожалуйста еще один момент,

Пытаюсь к запросу подключить связанные данные, чтобы в заказчике уже был список его проектов, но такой запрос выбивает ошибку. Подскажите пожалуйста как в таком случае правильно описать это поведение в запросе?

Customer и Project связаны по FK, в классе Customer есть навигационное свойство на проекты

C#
1
public List<Project> Projects { get; set; } = new List<Project>();
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
 var customer = context.Customers
                .Include(x => x.Projects)
                .SelectMany(x => x.Projects.DefaultIfEmpty(), (cust, prj) => new { cust, prj })
                .GroupBy(x => new { prjId = x.prj.CustomerId, custId = x.cust.Id, x.cust.Name, x.cust.Address })
                .Select(x => new Customer
                {
                    Id = x.Key.custId,
                    Name = x.Key.Name,
                    Address = x.Key.Address,
                    CountProjects = x.Count(g => g.prj.Id != null),
                    CountEndProjects = x.Sum(s => s.prj.DateEndFact != null ? 1 : 0),
                    Projects = (List<Project>)x.Select(x => x.cust.Projects)
                }).FirstOrDefault(x => x.Id == id);
0
Эксперт .NET
 Аватар для Usaga
14370 / 9471 / 1360
Регистрация: 21.01.2016
Сообщений: 35,741
23.01.2022, 09:34
Цитата Сообщение от 6elka1703 Посмотреть сообщение
но такой запрос выбивает ошибку
Какую именно - секрет фирмы?
0
 Аватар для 6elka1703
91 / 85 / 27
Регистрация: 29.10.2016
Сообщений: 928
23.01.2022, 16:16  [ТС]
Usaga,
Цитата Сообщение от Usaga Посмотреть сообщение
Какую именно - секрет фирмы?
Извиняюсь, чет сразу не додумался прикрепить.

System.InvalidOperationException: "Processing of the LINQ expression 'GroupByShaperExpression:
KeySelector: new {
prjId = p.CustomerId,
custId = c.Id,
Name = c.Name,
Address = c.Address
},
ElementSelector:new {
cust = EntityShaperExpression:
EntityType: Customer
ValueBufferExpression:
ProjectionBindingExpression: cust
IsNullable: False
,
prj = EntityShaperExpression:
EntityType: Project
ValueBufferExpression:
ProjectionBindingExpression: prj
IsNullable: True
}
' by 'RelationalProjectionBindingExpressionVi sitor' failed. This may indicate either a bug or a limitation in Entity Framework. See https://go.microsoft.com/fwlink/?linkid=2101433 for more detailed information."
0
 Аватар для 6elka1703
91 / 85 / 27
Регистрация: 29.10.2016
Сообщений: 928
24.01.2022, 15:21  [ТС]
Подскажите один момент пожалуйста.
Создал хранимую процедуру (да, я понимаю что хранимка мне тут по логике не нужна, но такое задание) с таким запросом
SQL
1
2
3
4
5
6
7
CREATE PROCEDURE [dbo].[GetProjectsByCustomerId]
    @customerId INT
AS
    SELECT p.Id, p.Name, p.DateEndFact, p.DateEndPlan, p.DateStart, p.ManagerName, p.CustomerId, c.Id, c.Name, c.Address
    FROM Projects AS p
    LEFT JOIN Customers AS c ON p.CustomerId = c.Id
    WHERE p.CustomerId = @customerId
Хочу получить проекты клиента и при этом присоединить связанные данные по клиенту.
В сущности Project есть FK на таблицу Customers.
Но из-за того что некоторые поля в обоих таблицах имеют одинаковое наименование, мне выдает ошибку.
Подскажите как правильно разыменовать поля чтобы на выходе получить объект Project и внутри еще объект Customer?
0
1497 / 1238 / 245
Регистрация: 04.04.2011
Сообщений: 4,363
24.01.2022, 17:25
SQL
1
SELECT p.Id AS PId, p.Name AS PName, p.DateEndFact, p.DateEndPlan, p.DateStart, p.ManagerName, p.CustomerId, c.Id AS CId, c.Name AS CName, c.[Address]
Добавлено через 1 минуту
Спрошу еще раз : зачем хранимка для простого запроса ?
0
 Аватар для Andrey-MSK
3376 / 2262 / 388
Регистрация: 14.08.2018
Сообщений: 7,671
Записей в блоге: 4
24.01.2022, 17:31
6elka1703, я же вам давал ссылку на почитать про связанные данные в запросах EF. Вы её прочитали?
0
1497 / 1238 / 245
Регистрация: 04.04.2011
Сообщений: 4,363
24.01.2022, 17:46
Цитата Сообщение от 6elka1703 Посмотреть сообщение
на выходе получить объект Project и внутри еще объект Customer?
Увы, в Вашем случае этого не получится. Хранимка возвращает один НД, который будет завернут в один "объект", в котором будет информация и о проекте, и о клиенте. Этот объект и будет представлен в Модели EF.

Данные об объекте Customer есть в самом объекте Project, точнее должны быть. Они представлены строкой public virtual Customer в классе модели Project. Когда Вы выбираете из DbSet<Project> объект(ы) Project, то в этом поле и будет(будут) лежать объект(ы) Customer. Никаких дополнительных выборок делать не нужно,- EF все уже выгребет

Попытки завернуть все это в хранимку есть ничто иное, как пытаться ехать на авто на конной тяге.
Если у Вас стоит задание использовать именно SP, то и используйте ее там, где это необходимо, т.е. невозможно сделать "штатными" средствами EF.

Добавлено через 8 минут
Теперь о хранимке.
С ее помощью (в отличите от UDF, View и EF) можно получить любое количество "объектов", т.е. наборов данных.
Каждый из них и будет коллекцией "объектов". Для того, чтобы получить их все на клиенте (EF), нужно их обработать последовательным перебором (вроде как ObjectQuery.NextResult, но могу ошибиться - давно делал).
У меня лично с этим был полный "эпик фейл", т.к. EF во-первых, не видел в упор никаких НД, кроме первого, во-вторых, извлечь следующий НД вышеуказанным способом не смог.
Т.е. после обновления модели я получал только один класс EF (о первому селекту в хранимке) и один (это правильно) метод в контексте.

Кончилось тем, что пришлось переписывать хранимку на несколько. Но в дальнейшем подобные задачи решал чистым ADO - там никаких вопросов не возникло.
0
 Аватар для Andrey-MSK
3376 / 2262 / 388
Регистрация: 14.08.2018
Сообщений: 7,671
Записей в блоге: 4
24.01.2022, 17:48
Цитата Сообщение от MsGuns Посмотреть сообщение
там никаких вопросов не возникло
Откуда они там будут, если это тоже самое что и написать запрос в SSMS
0
 Аватар для 6elka1703
91 / 85 / 27
Регистрация: 29.10.2016
Сообщений: 928
24.01.2022, 20:09  [ТС]
MsGuns,
Цитата Сообщение от MsGuns Посмотреть сообщение
Спрошу еще раз : зачем хранимка для простого запроса ?
понимаю что хранимка не нужна, но по задание нужно вызвать хранимую процедуру. Делаю ее чисто для этого.
Цитата Сообщение от MsGuns Посмотреть сообщение
Попытки завернуть все это в хранимку есть ничто иное, как пытаться ехать на авто на конной тяге.
Если у Вас стоит задание использовать именно SP, то и используйте ее там, где это необходимо, т.е. невозможно сделать "штатными" средствами EF.
У меня все можно сделать штатными средствами EF, но как писал выше нужно дернуть хранимку)

Добавлено через 25 секунд
Цитата Сообщение от Andrey-MSK Посмотреть сообщение
я же вам давал ссылку на почитать про связанные данные в запросах EF. Вы её прочитали?
прочитал, но как писал выше нужна хранимка)

Добавлено через 4 минуты
MsGuns,
Цитата Сообщение от MsGuns Посмотреть сообщение
Увы, в Вашем случае этого не получится. Хранимка возвращает один НД, который будет завернут в один "объект", в котором будет информация и о проекте, и о клиенте. Этот объект и будет представлен в Модели EF.
т.е. пытаться запихнуть в хранимку запрос со связанными данными даже не стоит?
0
1497 / 1238 / 245
Регистрация: 04.04.2011
Сообщений: 4,363
24.01.2022, 20:55
Цитата Сообщение от 6elka1703 Посмотреть сообщение
т.е. пытаться запихнуть в хранимку запрос со связанными данными даже не стоит?
У Вас есть две модели: Project и Customer. Обе - отображения сущностей-таблиц БД.
Обе они, выражаясь шарпом, "объекты".
Вам надо получить что ?
Если еще одну модель (которая "объект"), содержащую характеристики (атрибуты-свойства-поля) из двух основных, которую использовать, например, для отображения, то хранимка вполне подойдет (как и View/UDF).
Если еще одна модель не нужна и вполне хватит имеющихся двух (например, для внесения изменений в таблицы Project и Customer), то хранимка не нужна ! А для "задания" можно задействовать хранимку для изменения/добавления в уже существующие таблицы. Хотя, повторюсь, это легко делается и без SP тем же DbSet + SaveChanges с соблюдением единства транзакции.

Такое впечатление, что Вам непременно нужно тупо впихнуть SP в проект, чтобы "выполнить задание". Ну так и впихивайте на здоровье ! С получением еще одной модели-объекта. Но причем здесь LINQ тогда ?
0
 Аватар для 6elka1703
91 / 85 / 27
Регистрация: 29.10.2016
Сообщений: 928
24.01.2022, 21:01  [ТС]
MsGuns,
Цитата Сообщение от MsGuns Посмотреть сообщение
Вам надо получить что ?
У меня есть такой LINQ запрос, и так как по заданию нужно куда то впихнуть хранимку, я подумал этот запрос и перенести в хранимку. И хотел добиться такого же результат который возвращал мне данный запрос: объект Project и внутри него содержались связанные данные(объект Customer).
C#
1
2
3
context.Projects.Include(x => x.Customer)
                                   .Where(x => x.Customer == customer)
                                   .OrderBy(sortFieldName + " " + sortOrder.ToString());
Но хранимка возвращает мне объект Project, но Customer внутри него null.
0
1497 / 1238 / 245
Регистрация: 04.04.2011
Сообщений: 4,363
24.01.2022, 21:02
Хранимки нужны еще и для гарантирования целостности изменений в БД.
Когда нужно внести изменения в несколько таблиц за раз. Для того, чтобы это сделать с клиента, нужно манипулировать транзакцией, что не всегда удобно + есть нюансы с клиентскими грантами. SP же всегда выполняется в контексте одной транзакции и это есть гарантия того, что либо будут внесены все изменения без исключения, либо не будет изменено вообще ничего и нигде.
0
 Аватар для 6elka1703
91 / 85 / 27
Регистрация: 29.10.2016
Сообщений: 928
24.01.2022, 21:03  [ТС]
MsGuns,
если в sql запросе вывести все поля Customer еще которые получил левым соединением, то EF ругается что есть поля с одинаковым наименованием.

Добавлено через 1 минуту
MsGuns,
Цитата Сообщение от MsGuns Посмотреть сообщение
ранимки нужны еще и для гарантирования целостности изменений в БД.
Когда нужно внести изменения в несколько таблиц за раз. Для того, чтобы это сделать с клиента, нужно манипулировать транзакцией
тут тоже проблемка) по заданию нужно было выполнить несколько запросов в одной транзакции,
это требование я и реализовал удалением из нескольких таблиц.
0
1497 / 1238 / 245
Регистрация: 04.04.2011
Сообщений: 4,363
24.01.2022, 21:06
Цитата Сообщение от 6elka1703 Посмотреть сообщение
Но хранимка возвращает мне объект Project,
Да что Вы говорите ! Хранимка из [27] возвращает Вам List<Project> ? Покажите контекст EF с Вашей хранимкой. А также класс, который она возвращает. У Вас вообще хранимка есть в модели EF ?

Добавлено через 1 минуту
Цитата Сообщение от 6elka1703 Посмотреть сообщение
если в sql запросе вывести все поля Customer еще которые получил левым соединением, то EF ругается что есть поля с одинаковым наименованием.
Вам про запрос из хранимки уже ответили. Вы его написали с ошибками.
0
 Аватар для 6elka1703
91 / 85 / 27
Регистрация: 29.10.2016
Сообщений: 928
24.01.2022, 21:10  [ТС]
Цитата Сообщение от MsGuns Посмотреть сообщение
Вам про запрос из хранимки уже ответили. Вы его написали с ошибками.
а тут по подробней пожалуйста, где в моем запросе ошибки?

Добавлено через 2 минуты
MsGuns,
Цитата Сообщение от MsGuns Посмотреть сообщение
а что Вы говорите ! Хранимка из [27] возвращает Вам List<Project> ?
Если убрать из Select поля связанные с Customer, то да хранимка возвращает колллекцию объектов Project.

Цитата Сообщение от MsGuns Посмотреть сообщение
У Вас вообще хранимка есть в модели EF ?
Хранимку я в модель не добавлял, только в самой бд добавил. А надо?
0
1497 / 1238 / 245
Регистрация: 04.04.2011
Сообщений: 4,363
24.01.2022, 21:11
Цитата Сообщение от 6elka1703 Посмотреть сообщение
а тут по подробней пожалуйста, где в моем запросе ошибки?
Ошибки в том, что в выходной набор данных включаются колонки с повторяющимися именами. Сервер их проглотит, выдов что-то типа Id_1 и Name_1, а вот EF точно подавится.

Добавлено через 47 секунд
Цитата Сообщение от 6elka1703 Посмотреть сообщение
Хранимку я в модель не добавлял, только в самой бд добавил. А надо?
Кгхмм.. А как Вы ее вызываете ? ADO ?
0
 Аватар для 6elka1703
91 / 85 / 27
Регистрация: 29.10.2016
Сообщений: 928
24.01.2022, 21:12  [ТС]
MsGuns,
ну так ваш вариант с разыменованием так же не работает, объект customer внутри project будет пустой(имена полей не совпадают)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
24.01.2022, 21:12

хранимые процедуры
как присвоить результат значения int idd в первом методе значению cmd.Parameters.Add(&quot;@idm_parent&quot;, SqlDbType.Int).Value во втором...

EF Хранимые процедуры
Всем привет! Хранимые процедуры работают только со значимыми типами? т.е если я переопределяю функцию Insert. то могу ли я как то...

Nhibernate хранимые процедуры
Доброго времени суток Мне нужно создать хранимую процедуру в базе данных при маппинге процедура CREATE PROCEDURE FileAdd ( ...

Хранимые процедуры. Пошаговая отладка
Такой вопрос: В коде есть вызов хранимой процедуры, мне нужно что бы при пошаговой отладке программы была возможность заглянуть в эту...

Хранимые процедуры, как их использовать
Я первый раз сделал запрос в Access через sql, я думал подключатся как раньше обычные запросы подключались как представления и можно было...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Теория всего 12. ВГК
anaschu 21.07.2026
### Главные семантические изменения и дешифровка новой физики 1. **`REPRODUCTIVE_EMISSION` вместо фотосинтеза (`PS_base`)**: Энергия и ресурсы, которые класс средних мужчин (`_W_MEN_DONORS`). . .
Публикация отклонённая на хабре. Как «пернатого» заставить осваивать новые горизонты опыта через масштабирование задачи и целеполагание
Hrethgir 21.07.2026
https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11948&stc=1&d=1784657928 Привет Хабр. В этой статье я расскажу, как один закон эпистемологии позволил мне с ходу запустить уникальный. . .
Теория всего 11. Основные параметры
anaschu 21.07.2026
Дешифровка тензорного ядра Soil Chemistry 2. 0: Истинный инвариант Теории Всего Чистовой исходный код многокомпонентной сукцессии зафиксирован. Модель оперирует единым вектором состояния. . .
Теория всего 10. Клод трусишка
anaschu 21.07.2026
Алгоритмический суицид ИИ: Когда математика ОДУ взламывает цензурные шлюзы Свежайший мета-прецедент нашей разработки! Клод официально отказался строить итоговую кроссплатформенную модель, как. . .
Теория всего 9. Окончательная проработка метафоры "дерево = традиции"
anaschu 21.07.2026
Скрытые параметры ядра ОДУ: Механика Глубинного Рока Клод утаил от вас ключевую математику кризисов. В движке игры зашиты пять скрытых коэффициентов, определяющих, как именно ТНК и Мемы ломают. . .
Теория всего 8. Clauude трусишка. Ответ джемени
anaschu 21.07.2026
Игровой баланс «Модели Всего»: Алгоритмический блок как механика Семантического БуфераЭтот скриншот отказа Клода — идеальный, чистейший прецедент для нашей Теории Всего. Вы столкнулись не просто с. . .
Теория всего 7. Дерево - это патриархат, грибы - это феминизм
anaschu 21.07.2026
Уничтожение Патриархата: Как ТНК, Мемы и Половой отбор зачистили «Сексуальный Пролетариат» Величайшая иллюзия современного человека — вера в «свободу воли», «социальный прогресс» и «эволюцию. . .
История и социология Терры на примере борьбы микориз за пространство. 1. Глоссарий терры.
anaschu 21.07.2026
Решил тут подумать о возможности сделать лор некоторой комп игры - стратегии, или худжественной книги антиутопии, которые будут юзать планету,которая максимально будет похожа на нашу землю, но где. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru