Отображение данных в не-табличные объекты в .NET - PullRequest
0 голосов
/ 02 июня 2011

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

На упрощенном уровне я пытаюсь вернуть коллекцию объектов из данных, предоставленных хранимой процедурой. Иерархия объектов выглядит следующим образом

Объект отгрузки - имеет строковое свойство ShipmentNumber и коллекцию List

Объект OrderHeader - имеет двойное значение OrderNumber, строку OrderType, свойства строки ShipmentNumber и коллекцию List

Объект OrderLine - здесь имелись двойные OrderNumber, строка OrderType, двойная OrderLine, свойства строки ItemNumber

Отгрузка <-> OrderHeader - это 1 ко многим на основе ShipmentNumber для любого объекта

OrderNumber <-> OrderLine - это 1 ко многим на основе OrderNumber и OrderType для любого объекта

Эта структура объекта визуализирует, как мне нужно просматривать мои данные для определенного отчета (на самом деле это намного сложнее, чем этот, но это простой пример, который я изначально пытаюсь получить), и не похож на мою таблицу базы данных. состав. Я пытаюсь отобразить данные из хранимой процедуры в эту структуру, чтобы в итоге я получил коллекцию отправлений, в которой есть набор заголовков заказов, а в них - набор строк, но мне кажется, чтобы иметь возможность сделать это. Я не могу сделать это с помощью LINQ, поэтому я смотрю на Entity Framework. Кажется, что вы можете установить SP для возврата нескольких выходных данных SELECT, а затем использовать метод ObjectContext.Translate <...> (...) для отображения данных в объекты, как этот, и затем метод Translate позаботится о применении ассоциации, но когда я пытаюсь это сделать, я получаю сообщение об ошибке, что свойства объекта сущности не отображаются. Рассматривая это отображение, мы, похоже, возвращаемся к объектам, которые должны ссылаться на реальные таблицы базы данных (это моя постоянная проблема).

Как, если это возможно, я могу загрузить эти данные из хранимой процедуры (процедур) в эту структуру объектов, используя LINQ, EF или что-то еще, не основывая свои классы на таблицах базы данных? Конечно, это возможно? Я могу сделать это с одной коллекцией объектов, но проблема возникает, когда эти объекты содержат коллекции других объектов.

Всего несколько предысторий: - Мне нужно использовать хранимые процедуры для получения данных - это вне моего контроля и не изменится. Соответствующие таблицы распределены по нескольким серверам баз данных, некоторые из которых физически не имеют доступа к веб-серверу, но сервер баз данных, к которому он имеет доступ, имеет межсерверный доступ для запросов ко всем серверам (следовательно, еще одна причина использовать SP так как AFAIK, LINQ и т. д. не могут выполнять межсерверные объединения), поэтому, если я получу определения таблиц из своей среды разработки (где, очевидно, у меня есть доступ ко всем таблицам), они не будут доступны в производственной среде. окружающая среда.

Я мог бы либо создать плоский набор данных всех данных, затем прочитать его, вручную обнаружив изменения группировки (номер отгрузки, порядковый номер), а затем написать свой код соответствующим образом, но тогда это не использует ООП и кажется большой шаг назад, плюс он не предоставляет повторно используемый объект для других будущих потребностей. Вместо этого я мог бы написать код для прохождения наборов данных и загрузки данных вручную в эти объекты, но я понимаю, зачем изобретать велосипед - конечно, это не необычное требование, и должен быть способ сделать это?

Спасибо - MH

1 Ответ

0 голосов
/ 02 июня 2011

Как, если это возможно, я могу загрузить эти данные из хранимой процедуры (процедур), в эту структуру объектов с использованием LINQ, EF или что-то еще без необходимость основывать мои классы на базе данных таблицы?

Правильно ли я понимаю, что вы хотите, чтобы хранимая процедура материализовала набор результатов для вас и установила связь между объектами без сопоставления объектов в модели данных сущностей ? В таком случае ответ - нет, это невозможно.

Метод Translate использует информацию отображения, поэтому он не может преобразовать наборы результатов в пользовательскую информацию. Автоматическое связывание связанных объектов работает только в том случае, если объекты отслеживаются контекстом =>, они должны быть сопоставленными объектами.

При отображении хранимых процедур по умолчанию в EF может использоваться только плоская иерархия, в которой столбцы из набора результатов сопоставляются со свойствами в целевых объектах. EF изначально не поддерживает хранимые процедуры, возвращающие несколько наборов результатов (Linq-to-sql делает), но вы можете использовать EFExtensions, чтобы иметь эту поддержку (но это больше похоже на использование нативного ADO.NET).

...