Форум программистов, компьютерный форум, киберфорум
C#: Базы данных
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/21: Рейтинг темы: голосов - 21, средняя оценка - 5.00
1 / 1 / 0
Регистрация: 18.09.2010
Сообщений: 45

Наследование в Entity Framework Code First

17.03.2015, 16:25. Показов 4059. Ответов 17
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте. Разбираюсь с EF:CF, прочитал уже довольно много материала, но все же столкнулся с проблемой.
Суть в том, что у меня есть базовый класс:
C#
1
2
3
4
5
public class Advertise
    {
        public int Id { get; set; }
        public string Description { get; set; }
    }
От которого я наследую следующий:
C#
1
2
3
4
public class FullscreenAdvertise : Advertise
    {
        public string Source { get; set; }
    }
Есть таблица с расписанием:
C#
1
2
3
4
5
6
7
8
  public class AdSchedule
    {
        public int Id { get; set; }
        public DateTimeOffset StartDate { get; set; }
        public DateTimeOffset EndDate { get; set; }
        public TimeSpan Interval { get; set; }
        public Advertise Advertise { get; set; } //Внешний ключ на базовый класс
    }
Контекст:
C#
1
2
        public DbSet<Advertise> Advertises { get; set; }
        public DbSet<FullscreenAdvertise> FullscreenAdvertises { get; set; }
Заполняю значения: (отрывок)
C#
1
2
3
4
5
6
7
8
9
Advertise = new FullscreenAdvertise
                    {
                        AdType = new AdType { AdName = "Полноэкранная реклама", AdCode = "FullScreenAd" },
                        Description = "Реклама Reebok",
                        Source = "video.mp4"
                    },
                StartDate = DateTimeOffset.Now,
                EndDate = DateTimeOffset.Now.AddDays(5),
                Interval = new TimeSpan(0, 1, 0)
После Linq запроса я хочу достать, к примеру, свойство Source, которое есть у дочернего класса, но вот незадача, у меня есть доступ только к свойствам родителя. При этом, если объект попытаться сериализовать, то в результат попадет дочернее свойство.
Может это не фреймворк проблемный, а я?
Миниатюры
Наследование в Entity Framework Code First  
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
17.03.2015, 16:25
Ответы с готовыми решениями:

Entity Framework code first
Доброго времени суток :) Буду краток! БД: MsSql2012 через Entity Framework соединяю с приложением. Проект, прилагается: Когда...

Entity Framework( Code First)
Создаю БД из 3-х таблиц. Использую связи один-ко-многим(Department и Employee) и многие-ко многим(Employee и Client). Правильно ли это...

Firebird and entity framework code first
Всем привет, столкнулся с проблемой: модель пользователя: public class User { public int ID { get; set; } ...

17
Эксперт .NET
 Аватар для insite2012
5548 / 4311 / 1218
Регистрация: 12.10.2013
Сообщений: 12,371
Записей в блоге: 2
17.03.2015, 17:24
Цитата Сообщение от OverBack Посмотреть сообщение
у меня есть доступ только к свойствам родителя.
Это вполне естественно. Вы создали ссылку типа базового класса, и ей присвоили объект класса-наследника. Таким образом, вы можете получить доступ только к тем членам, которые определены в родительском классе.
Чтобы получить свойства, определенные в классе-наследнике, используйте явное приведение типов.
0
1 / 1 / 0
Регистрация: 18.09.2010
Сообщений: 45
17.03.2015, 17:37  [ТС]
insite2012, уже делал так, но слишком много лишнего кода, существует возможность получить сразу все свойства?
0
 Аватар для kodv
1449 / 1121 / 347
Регистрация: 11.04.2011
Сообщений: 2,621
17.03.2015, 17:46
Цитата Сообщение от OverBack
существует возможность получить сразу все свойства?
Может использовать ссылку на класс наследника? Что мешает?
0
1 / 1 / 0
Регистрация: 18.09.2010
Сообщений: 45
17.03.2015, 17:56  [ТС]
kodv, это через Activator.CreateInstance()?
0
Эксперт .NET
 Аватар для insite2012
5548 / 4311 / 1218
Регистрация: 12.10.2013
Сообщений: 12,371
Записей в блоге: 2
17.03.2015, 18:08
Цитата Сообщение от kodv Посмотреть сообщение
Может использовать ссылку на класс наследника?
Мы не ищем легких путей.
Цитата Сообщение от OverBack Посмотреть сообщение
это через Activator.CreateInstance()?
Это отражение, и вам оно тут вовсе ни к чему.
Либо использовать явное приведение типов (кода там не много, один оператор), либо использовать сразу нужный тип. Иначе никак.
Максимум, что вы можете - определить оператор неявного преобразования, но это вряд ли что-то даст...
0
1 / 1 / 0
Регистрация: 18.09.2010
Сообщений: 45
17.03.2015, 18:13  [ТС]
insite2012, проблема в том, что у меня несколько дочерних классов и явно привести тип я не могу (наверное). Конечно, можно по GetType() switch-case построить, но мне кажется это ну.. не знаю.. неправильно что ли?
0
Эксперт .NET
 Аватар для insite2012
5548 / 4311 / 1218
Регистрация: 12.10.2013
Сообщений: 12,371
Записей в блоге: 2
17.03.2015, 18:16
Цитата Сообщение от OverBack Посмотреть сообщение
у меня несколько дочерних классов и явно привести тип я не могу
Если вы уверены в том что делаете - используйте dynamic. Естественно, все это будет на ваш страх и риск.
1
1 / 1 / 0
Регистрация: 18.09.2010
Сообщений: 45
17.03.2015, 18:21  [ТС]
insite2012, а чем это чревато?
0
 Аватар для kodv
1449 / 1121 / 347
Регистрация: 11.04.2011
Сообщений: 2,621
17.03.2015, 18:32
Цитата Сообщение от OverBack Посмотреть сообщение
а чем это чревато?
Исключениеями в рантайме, если не угадаете имя метода.
Цитата Сообщение от OverBack Посмотреть сообщение
у меня несколько дочерних классов и явно привести тип я не могу
От куда тогда уверенность, что у конкретного объекта обязательно есть свойство определенного дочернего класса, если по вашей логике этот конкретный объект в данном контексте может иметь тип любого дочернего класса?
1
1 / 1 / 0
Регистрация: 18.09.2010
Сообщений: 45
17.03.2015, 18:52  [ТС]
kodv,
C#
1
Advertise = [B]new FullscreenAdvertise[/B]
Когда добавляю запись, то указываю тип, отсюда и уверенность.
Мне нужно чтобы в таблице AdSchedule был внешний ключ на Advertise либо на его потомков, и я думал, что наследование поможет мне в этом
0
1 / 1 / 0
Регистрация: 18.09.2010
Сообщений: 45
17.03.2015, 18:59  [ТС]
Вот, что я имею в данный момент. А свойство дочернего класса находится в кирпичике выше. Если я приведу явно, то получу только его, а хотелось бы все вместе
Миниатюры
Наследование в Entity Framework Code First  
0
 Аватар для kodv
1449 / 1121 / 347
Регистрация: 11.04.2011
Сообщений: 2,621
17.03.2015, 19:06
OverBack, то есть, вы не можете произвести явное приведение к типу FullscreenAdvertise, потому что объект может быть другого типа, но вы желаете использовать свойство FullscreenAdvertise.Source, так как все объекты будут типа FullscreenAdvertise? Противоречие не улавливаете?

Добавлено через 3 минуты
OverBack, вы не понимаете ни принципа наследования, ни принципа полиморфизма. Если перечитать и разобраться, то вопросов станет намного меньше. В объекте класса FullscreenAdvertise будут видны все свойства.
1
1 / 1 / 0
Регистрация: 18.09.2010
Сообщений: 45
17.03.2015, 19:08  [ТС]
kodv, извините, что-то видимо я натупил. Второй день сижу. И кажется, я понял в чем проблема, поправьте меня, пожалуйста, если я ошибаюсь:
По ID я вытягиваю запись из таблицы где может быть родитель или кто-то из детей, определяю тип и в зависимости от типа выстраиваю логику разбора этих данных, да? То есть банальный свитч?
Почему-то мне казалось, что можно сделать как-то проще, а SwCa плохой выбор..
0
 Аватар для kodv
1449 / 1121 / 347
Регистрация: 11.04.2011
Сообщений: 2,621
17.03.2015, 19:22
Лучший ответ Сообщение было отмечено OverBack как решение

Решение

OverBack, да, вы все правильно поняли. Хотя в идеале нужно стараться выстраивать логику приложения так, чтобы избегать подобных свичей. Вот появится у вас еще один наследник, и вам придется во все 100500 мест, где встречается подобный свич, добавить еще одну ветвь кода. А это не есть хорошо.
1
Эксперт .NET
 Аватар для insite2012
5548 / 4311 / 1218
Регистрация: 12.10.2013
Сообщений: 12,371
Записей в блоге: 2
17.03.2015, 20:22
Цитата Сообщение от kodv Посмотреть сообщение
Вот появится у вас еще один наследник
А если организовать словарь типов? Тогда можно будет везде использовать метод поиска в словаре, а при появлении еще одного наследника изменить только одно место - сам словарь...
0
 Аватар для kodv
1449 / 1121 / 347
Регистрация: 11.04.2011
Сообщений: 2,621
17.03.2015, 20:35
insite2012, я, если честно, толком в задачу ТС не вникал. Поэтому у меня нет ни правильного ответа, ни своего мнение по поводу того, как это должно выглядеть для данной задачи. Направление явно верное. В вашем мастерстве программирования я никогда не сомневался :-)
0
Эксперт .NET
 Аватар для insite2012
5548 / 4311 / 1218
Регистрация: 12.10.2013
Сообщений: 12,371
Записей в блоге: 2
17.03.2015, 20:38
kodv, я примерно такой пример использовал (только не с типами, а с байтами), когда мне по принятому байту необходимо было определить тип устройства. Сначала тоже со switch морочился, а когда типов стало много (в процессе развития программы), сделал один общий словарь (static, в файле Program.cs), и использовал его. И если раньше приходилось во многих местах, где необходимо проверить тип перебирать через switch, то потом стало проще - поиск в словаре по ключу и все.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
17.03.2015, 20:38
Помогаю со студенческими работами здесь

Первые шаги в Code first entity framework
С добрым днём! Попытался создать пробный проект (VS 2010, EF 4.1). Вроде всё пошло, но почему-то генериться исключение...

Entity Framework Code First Каскадное удаление
Создал базу данных с помощью Entity Framework Code First: namespace Portal.Models { public class Photo { ...

Entity Framework (Code First) использование кириллицы в классе
Добрый вечер. Использую в проекте Entity Framework, подход Code First. БД - MS SQL. Описал класс следующим образом: ...

ADO.Net Entity Framework неправильное наследование
Добрый день. Хотел спросить: В книге &quot;Нейгел К., Ивьен Б., Глинн Дж., Уотсон К. C# 4.0 и платформа .NET4 для профессионалов -...

Профайлер для MySql при работе с Entity Framework (Code First)
Какой утилитой можно посмотреть запросы к MySql серверу посредством Entity Framework ? Добавлено через 46 минут пробовал Neor...


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

Или воспользуйтесь поиском по форуму:
18
Ответ Создать тему
Новые блоги и статьи
Загрузка PNG-файла с альфа-каналом с помощью библиотеки SDL3_image на Android
8Observer8 27.01.2026
Содержание блога SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
влияние грибов на сукцессию
anaschu 26.01.2026
Бифуркационные изменения массы гриба происходят тогда, когда мы уменьшаем массу компоста в 10 раз, а скорость прироста биомассы уменьшаем в три раза. Скорость прироста биомассы может уменьшаться за. . .
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip" Извлеките архив и вы увидите. . .
Вывод текста со шрифтом TTF на Android с помощью библиотеки SDL3_ttf
8Observer8 25.01.2026
Содержание блога Если у вас не установлены Android SDK, NDK, JDK, и т. д. то сделайте это по следующей инструкции: Установка Android SDK, NDK, JDK, CMake и т. д. Сборка примера Скачайте. . .
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
моя боль
iceja 24.01.2026
Выложила интерполяцию кубическими сплайнами www. iceja. net REST сервисы временно не работают, только через Web. Написала за 56 рабочих часов этот сайт с нуля. При помощи perplexity. ai PRO , при. . .
Модель сукцессии микоризы
anaschu 24.01.2026
Решили писать научную статью с неким РОманом
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru