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

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

21.01.2022, 01:27. Показов 3310. Ответов 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
1497 / 1238 / 245
Регистрация: 04.04.2011
Сообщений: 4,363
24.01.2022, 21:12
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от 6elka1703 Посмотреть сообщение
Если убрать из Select поля связанные с Customer, то да хранимка возвращает колллекцию объектов Project.
Ну да
Вы, похоже, совсем запутались в двух соснах.
0
 Аватар для 6elka1703
91 / 85 / 27
Регистрация: 29.10.2016
Сообщений: 928
24.01.2022, 21:12  [ТС]
MsGuns,
Цитата Сообщение от MsGuns Посмотреть сообщение
Кгхмм.. А как Вы ее вызываете ? ADO ?
C#
1
2
Microsoft.Data.SqlClient.SqlParameter paramCustomerId = new Microsoft.Data.SqlClient.SqlParameter("@customerId", customer.Id);
var projects = context.Projects.FromSqlRaw("GetProjectsByCustomerId @customerId", paramCustomerId);
0
1497 / 1238 / 245
Регистрация: 04.04.2011
Сообщений: 4,363
24.01.2022, 21:13
Цитата Сообщение от 6elka1703 Посмотреть сообщение
объект customer внутри project будет пустой
Что Вы понимаете под "объектом" ?
0
 Аватар для 6elka1703
91 / 85 / 27
Регистрация: 29.10.2016
Сообщений: 928
24.01.2022, 21:15  [ТС]
MsGuns,
Цитата Сообщение от MsGuns Посмотреть сообщение
Что Вы понимаете под "объектом" ?
Экземпляр класса.
0
1497 / 1238 / 245
Регистрация: 04.04.2011
Сообщений: 4,363
24.01.2022, 21:16
Свойство Custom в модели Project должно быть virtual. У Вас же чушь получается
0
 Аватар для 6elka1703
91 / 85 / 27
Регистрация: 29.10.2016
Сообщений: 928
24.01.2022, 21:19  [ТС]
MsGuns,
Цитата Сообщение от MsGuns Посмотреть сообщение
Свойство Custom в модели Project должно быть virtual. У Вас же чушь получается
Почему? Я же не наследуюсь от класса Customer.
0
1497 / 1238 / 245
Регистрация: 04.04.2011
Сообщений: 4,363
24.01.2022, 21:20
В свою очередь в модели Custom должно быть что-то вроде public virtual ICollection<Project>.
Тогда EF поймет что к чему. И никакой хранимки не требуется

Создайте маленькую БД, в которой 2 таблички со связью. Потом в новом проекте подключите EF и мапируйте в Модель эту базу. И посмотрите, что у Вас появится в папке Models/.edmx (классы и контекст)
Потом в рабочем проекте следуйте этой "рыбе".
0
 Аватар для 6elka1703
91 / 85 / 27
Регистрация: 29.10.2016
Сообщений: 928
24.01.2022, 21:22  [ТС]
MsGuns,
Цитата Сообщение от MsGuns Посмотреть сообщение
И никакой хранимки не требуется
Повторюсь, хранимку создал только потому что этого требует задание, а так я спокойно могу получить эти данные с помощью EF. Я это прекрасно понимаю.
0
1497 / 1238 / 245
Регистрация: 04.04.2011
Сообщений: 4,363
24.01.2022, 21:22
6elka1703, Ваша беда в неопытности использования EF Core. Вы наобум лепите в классах модели какие-то "связи", а EF не может Вас понять.
0
 Аватар для 6elka1703
91 / 85 / 27
Регистрация: 29.10.2016
Сообщений: 928
24.01.2022, 21:23  [ТС]
Цитата Сообщение от MsGuns Посмотреть сообщение
В свою очередь в модели Custom должно быть что-то вроде public virtual ICollection<Project>.
в модели Custom у меня есть навигационное свойство public List<Project> Projects { get; set; } = new List<Project>();
0
1497 / 1238 / 245
Регистрация: 04.04.2011
Сообщений: 4,363
24.01.2022, 21:24
Цитата Сообщение от 6elka1703 Посмотреть сообщение
Повторюсь, хранимку создал только потому что этого требует задание
Я уже устал Вам повторять одно и то же.
Хотите добавить хранимку - добавляйте, но через EF ! тогда не будет всего этого бардака.
0
 Аватар для 6elka1703
91 / 85 / 27
Регистрация: 29.10.2016
Сообщений: 928
24.01.2022, 21:25  [ТС]
MsGuns,
Цитата Сообщение от MsGuns Посмотреть сообщение
Хотите добавить хранимку - добавляйте, но через EF ! тогда не будет всего этого бардака.
Через EF, вы имеете ввиду добавить еще один класс который будет хранить поля возвращаемые из хранимки?
0
1497 / 1238 / 245
Регистрация: 04.04.2011
Сообщений: 4,363
24.01.2022, 21:26
Цитата Сообщение от 6elka1703 Посмотреть сообщение
в модели Custom у меня есть навигационное свойство public List<Project> Projects { get; set; } = new List<Project>();
Прочитайте еще [47].

Добавлено через 1 минуту
Цитата Сообщение от 6elka1703 Посмотреть сообщение
Через EF, вы имеете ввиду добавить еще один класс который будет хранить поля возвращаемые из хранимки?
Да. Как добавлять хранимки, udf в коре, читайте в инете.
0
 Аватар для 6elka1703
91 / 85 / 27
Регистрация: 29.10.2016
Сообщений: 928
24.01.2022, 21:28  [ТС]
MsGuns,
Цитата Сообщение от MsGuns Посмотреть сообщение
Да. Как добавлять хранимки, udf в коре, читайте в инете.
Просто я не совсем понимаю, зачем плодить лишние классы?
0
1497 / 1238 / 245
Регистрация: 04.04.2011
Сообщений: 4,363
24.01.2022, 21:31
Цитата Сообщение от 6elka1703 Посмотреть сообщение
Почему? Я же не наследуюсь от класса Customer.
Какое отношение атрибут virtual имеет к наследованию ?

Добавлено через 1 минуту
Цитата Сообщение от 6elka1703 Посмотреть сообщение
Просто я не совсем понимаю, зачем плодить лишние классы?
Я тоже. Этот новый класс не нужен, я об этом писал неоднократно. Но Вам нужна SP для "задания". А если так, то нужен и новый класс. Что тут неясно ?
0
 Аватар для 6elka1703
91 / 85 / 27
Регистрация: 29.10.2016
Сообщений: 928
24.01.2022, 21:37  [ТС]
Цитата Сообщение от MsGuns Посмотреть сообщение
Какое отношение атрибут virtual имеет к наследованию ?
Ну насколько я помню, атрибутом virtual мы помечаем свойства и методы класса родителя, поведение которых хотим переопределить в классе наследнике. Возможно я ошибаюсь.

Добавлено через 6 минут
MsGuns,
Цитата Сообщение от MsGuns Посмотреть сообщение
Я тоже. Этот новый класс не нужен, я об этом писал неоднократно. Но Вам нужна SP для "задания". А если так, то нужен и новый класс. Что тут неясно ?
Тогда мне не совсем понятна такая ситуация
У меня есть такой запрос
C#
1
2
context.Projects.Include(x => x.Customer)
                       .Where(x => x.Customer == customer);
Если его выполнить то он вернет мне коллекцию объектов Project внутри которого так же будут содержаться данные Customer.
И этот запрос по факту транслируется в sql в нечто подобное

SQL
1
2
3
4
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
Тогда почему я не могу выполнить такой же sql запрос получить такой же результат как если бы я выполнял запрос LINQ?
0
1497 / 1238 / 245
Регистрация: 04.04.2011
Сообщений: 4,363
24.01.2022, 21:46
Попробую объяснить еще раз. В [42] Вы используете контекст EF для произвольного запроса, в данном случае к SP, неизвестной EF. EF до того, как выполнить его, пытается его "расшифровать", для чего лезет в метаданные СУБД и определяет колонки возвращаемого результата. Сам запрос при этом еще не выполняется !
И видит там одинаковые названия колонок, которые он не может интерпретировать как имена свойств возвращаемого класса из-за их идентичности.
Если исправить эту ошибку, то EF скушает запрос и выполнит его, возвратив коллекцию объектов нового класса, созданного им динамически. Но этот класс будет анонимным. Посмотрите, что у Вас появится в переменной projects, типизированной неявно.

Добавлено через 1 минуту
Цитата Сообщение от 6elka1703 Посмотреть сообщение
И этот запрос по факту транслируется в sql в нечто подобное
Из чего следует такой вывод ?
0
 Аватар для 6elka1703
91 / 85 / 27
Регистрация: 29.10.2016
Сообщений: 928
24.01.2022, 21:50  [ТС]
MsGuns,
Цитата Сообщение от MsGuns Посмотреть сообщение
Попробую объяснить еще раз. В [42] Вы используете контекст EF для произвольного запроса, в данном случае к SP, неизвестной EF. EF до того, как выполнить его, пытается его "расшифровать", для чего лезет в метаданные СУБД и определяет колонки возвращаемого результата. Сам запрос при этом еще не выполняется !
И видит там одинаковые названия колонок, которые он не может интерпретировать как имена свойств возвращаемого класса из-за их идентичности.
Понял.

Цитата Сообщение от MsGuns Посмотреть сообщение
Посмотрите, что у Вас появится в переменной projects, типизированной неявно.
вернет IQueryable<Project>

Добавлено через 1 минуту
MsGuns,
Цитата Сообщение от MsGuns Посмотреть сообщение
Из чего следует такой вывод ?
Когда читал про получение связанных данных, там показывали на примере двух связанных сущностей sql запрос который будет на выходе, выглядел он точно так же как и мой запрос.
0
1497 / 1238 / 245
Регистрация: 04.04.2011
Сообщений: 4,363
24.01.2022, 21:57
Короче. Просто совет.
Специально для SP добавьте в проект некий визуальный элемент для отображения какой-нибудь "солянки" из двух таблиц. Набор данных для него получайте вызовом этой самой SP. Да, будет новый класс. Можно добавить его в модель, а можно не добавлять - грид сам его проинтерпретирует. При этом новая модель будет иметь только скалярные поля.
И все.
0
 Аватар для 6elka1703
91 / 85 / 27
Регистрация: 29.10.2016
Сообщений: 928
24.01.2022, 21:59  [ТС]
MsGuns, понял, спасибо.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
24.01.2022, 21:59

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
60
Ответ Создать тему
Новые блоги и статьи
сукцессия 41
anaschu 24.07.2026
Численная верификация бифуркации в агентной модели лесной сукцессии: от одного параметра к ансамблю Автор: пользователь @Shumilov_AS | Раздел: Прикладная математика / Численные методы Кратко. . .
сукцессия 40. Ансамблевая кластерная параметризаци, часть 1.
anaschu 24.07.2026
Пр# Сопровождение научной статьи ИИ-ассистентом: подготовка публикации и калибровка агентно-ориентированной модели сукцессии микоризных систем **Полевые заметки о двухнедельной совместной работе**. . .
Теория всего 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
Игровой баланс «Модели Всего»: Алгоритмический блок как механика Семантического БуфераЭтот скриншот отказа Клода — идеальный, чистейший прецедент для нашей Теории Всего. Вы столкнулись не просто с. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru