2017-01-13 3 views
0

У меня возникли проблемы с поиском, как извлекать данные из SQL и сохранять их в соответствующий подтип. Например, у меня есть система инвентаризации. У меня есть базовый класс под названием «Активы» и у меня есть следующие подклассы, которые простираются от «Активов»: 1. Ноутбука (имеет скорость и поле памяти) 2. MobileDevice (имеет ESN и PIN поле)C# Наследование и доступ к данным, хранящимся в SQL

Каждый подкласс имеет свои собственные уникальные поля (как показано выше), и они имеют общие поля (т. е. make, model, серийный номер и т. д.). Мой вопрос в том, что если кто-то выполняет поиск всех активов для конкретного пользователя через веб-страницу, набор результатов будет включать любое количество этих разных типов. Если я нажму «подробности о просмотре» для iPhone, как я скажу, чтобы страница загружала MobileDevice vs. Laptop. Прямо сейчас, я могу только извлекать результаты как активы, но тогда я пропускаю эти уникальные поля. Возможно ли это? Кажется, я не могу найти что-либо в Интернете. это просто вопрос кастинга? Пожалуйста помоги! Обратите внимание: я использую C#, но не LINQ. Просто хранимые процедуры и т. Д. Оцените любую помощь.

+0

Добро пожаловать в StackOverflow! Пожалуйста, разместите свой код на C#, иначе любые ответы будут основаны на связке, вероятно, неправильных предположений (и более подробных сведений о том, как она разговаривает с Интернетом), также будет замечательный ответ). _Presumably_ ваш веб-сервис отвечает чем-то вроде JSON, и, предположительно, ваш JSON содержит то, что идентифицирует эти объекты JSON как мобильный или ноутбук. Тогда это всего лишь случай прокрутки этого JSON и сопоставление каждого с объектом «Laptop» или «MobileDevice» C#, все хранятся, например. 'Asset []' или 'List '. –

+0

Это более общий вопрос. Пока нет кода, поскольку я пытаюсь найти лучший способ справиться с этим. – user3275950

+0

Мы ожидаем конкретного вопроса о SO. Возможно, вы можете сделать несколько прототипов, а затем спросить о трудностях, с которыми вы сталкиваетесь во время прогресса. –

ответ

0

Во-первых, основной проблемой является несоответствие между реляционным и объектно-ориентированным дизайном. Это то, что, похоже, не так много, пока вы не начнете смотреть на него. Первое, что нужно отметить, это то, что идея реляционного дизайна и идеальный дизайн OO различны, потому что они настроены вокруг различных проблем. Реляционный дизайн фокусируется на функциональных зависимостях в математическом смысле (f (x) = y), тогда как дизайн OO фокусируется на инкапсулировании состояния за интерфейсом. Иными целями являются то, что создает эту проблему в первую очередь.

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

Вы начинаете с дерева наследования в вашем приложении, как так:

  • Supertype
    • Подтип 1
    • Подтип 2
    • подтип 3

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

У вас в основном есть несколько способов решения этой проблемы.

  1. Многих ORMs имеют функции для обработки такого рода вопросы для вас, или
  2. Вы придаете отображение к подтипу, и полностью переопределить из супертипа.

Если вы уже используете ORM, то его решение будет наилучшим. Если вы где-то пишете SQL вручную, то, как правило, второй метод является более чистым (и, кроме всего прочего, позволяет лучше полиморфизм, поэтому вы можете улучшить OO и улучшенный реляционный дизайн).

+0

Но каков наилучший способ получить эти данные в соответствующий объект. Например. Если это мобильное устройство, как я это делаю, выберите данные и сохраните их в объекте MobileDevice vs., Asset? Это просто вопрос кастинга? – user3275950

+0

Я думаю, вы хотите отделить свои предположения о постоянстве от поведения вашего бизнес-объекта. Образец DAO/Repository может быть хорошим вариантом здесь. Затем слой persistence узнает, какой подтип возвращается и возвращает его. Верхний уровень затем просто заботится о интерфейсе и поведении. –

+0

Одна вещь, с которой я играл, - это следующий код: могу ли я сделать что-то подобное при извлечении данных из SQL ?. Предположим, что значение 1 = мобильное устройство: if (Convert.ToInt16 (rd ["assetType"]) == 1) {Asset = new MobileDevice(); } – user3275950

Смежные вопросы