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

Связь 1:1 между несколькими таблицами Entity Framework

18.02.2020, 20:48. Показов 3213. Ответов 13

Студворк — интернет-сервис помощи студентам
Есть недвижимость 3-х типов земельные участки, квартиры и дома хочу внести адресные данные в общую таблицу и остальные по соответствующим (См. вложение №1). Вопрос как сделать связи в Entity Framework правильно ибо у меня выходит ошибка при миграции (См вложение №2). Сущности описаны ниже.

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
abstract class RealEstateAddress
    {
        public int RealEstateAddressId { get; set; }
        public HouseInfo HouseInfo { get; set; }
        public LandInfo LandInfo { get; set; }
        public ApartmentInfo ApartmentInfo { get; set; }
 
        public string City { get; set; }
 
        public string Street { get; set; }
 
        public string House { get; set; }
 
        public string Number { get; set; }
 
        public virtual ICollection<Supply> Supplies { get; set; }
 
        public override string ToString()
        {
            return $"Город {City}, улица {Street}, дом {House}, номер квартиры {Number}.";
        }
    }
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
class ApartmentInfo : RealEstateAddress
    {
        public int ApartmentInfoId { get; set; }
        public virtual RealEstateAddress Address { get; set; }
 
        public int Floor { get; set; }
 
        public int Rooms { get; set; }
 
        public int Area { get; set; }
 
        //Позже будут добавлены новые поля 
    }
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
class LandInfo : RealEstateAddress
{
    public int LandInfoId { get; set; }
    public virtual RealEstateAddress Address { get; set; }
 
    public float? Area { get; set; }
 
    public float? Longitude { get; set; }
 
    public float? Latitude { get; set; }
 
    //Позже будут добавлены новые поля 
}
C#
1
2
3
4
5
6
7
8
9
10
11
12
class HouseInfo : RealEstateAddress
    {
        public int HouseInfoId { get; set; }
        public virtual RealEstateAddress Address { get; set; }
 
        public int? Rooms { get; set; }
 
        public float? Area { get; set; }
 
        public int? Floors { get; set; }
        //Позже будут добавлены новые поля 
    }
Миниатюры
Связь 1:1 между несколькими таблицами Entity Framework   Связь 1:1 между несколькими таблицами Entity Framework  
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
18.02.2020, 20:48
Ответы с готовыми решениями:

Entity Framework. Связь между таблицами один ко многим
Здравствуйте. Столкнулся с такой проблемой - у меня есть таблицы Тестов и Вопросов (к тестам), связь один ко многим. Реализация следующая...

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

Entity Framework. Связь 1 к 1
Привет всем Имею два класса: public class EntityA { public Guid Id { get; set; } } public class EntityB {

13
Эксперт .NET
 Аватар для Usaga
14293 / 9378 / 1352
Регистрация: 21.01.2016
Сообщений: 35,344
19.02.2020, 04:16
Гречка, во-первых, один-к-одному это про две сущности: одна слева, вторая справа. А вы что хотите? Правильно, четыре сущности. Это уже один-ко-многим. Во-вторых, вы накорячили наследование бредовое: Инфорация о Доме по вашей модели является Адресом недвижимости. Не ерунда ли?)

Все три ваши сущности должны ссылаться на Адрес. Т.е. связь один-ко-многим. То, что Дом, Земельный участок и Квартира могут ссылаться на один и тот же адрес - естественное положение дел, как девятиэтажка по улице Ленина, 90, где все квартиры тоже находятся на улице Ленина, 90.
0
0 / 0 / 0
Регистрация: 13.09.2018
Сообщений: 11
19.02.2020, 05:38  [ТС]
Как раз таки наоборот на один адрес не может ссылаться несколько квартир. В классе RealEstateAddress видно что под адресом подразумевается город улица дом квартира и все эти поля не обязательные. И если руководствоваться вашей логикой как риэтеру ориентироваться такой базой? Покажешь сегодня 2 квартиры и обе они находятся на Ленина 90, а квартиру сам найдешь.
0
Эксперт .NET
 Аватар для Usaga
14293 / 9378 / 1352
Регистрация: 21.01.2016
Сообщений: 35,344
19.02.2020, 06:46
Гречка, ну ОК. Тогда просто ссылайтесь на адрес напрямую из каждой сущности. Уникальность использования адреса можно гарантировать одним из двух способов:
* В коде, при связывании сущности с адресом проверять не задействован ли адрес ещё где;
* В схеме базы данных, введя таблицу-связь вида

SQL
1
2
3
4
5
6
7
8
CREATE TABLE RealEstateAssociation (
    RealEstateId INT NOT NULL,
    AppartementInfoId INT,
    LandInfoId INT,
    HouseId INT,
    PRIMARY KEY(RealEstateId),
    CONSTRAINT FK_RealEstateAssociation_RealEstate FOREIGN KEY (RealEstateId) REFERENCES RealEstate (Id)
)
Тогда не получится завести более одной связи с одним адресом.

Я бы рекомендовал первый вариант, ибо проще, хоть и менее надёжен.
0
0 / 0 / 0
Регистрация: 13.09.2018
Сообщений: 11
19.02.2020, 07:01  [ТС]
Вы предлагаете создать таблицу запросом. А я хочу чтобы Entity fraemwork создавал таблицы и связи с помощью кода на C#. Как сделано в видео на ютубе(видео идет 2 часа https://youtu.be/XHuUN1u8ZPE). Только вот проблема то в том что в видео говорится как сделать связь 1:1 между 2 таблицами а у меня их 4.

Измененно: писал автору видео о такой проблеме он посоветовал сделать класс RealEstateAddress абстрактным и чтобы вторичные таблицы наследовали его. Но это мне не помогло и я теперь здесь
0
Эксперт .NET
 Аватар для Usaga
14293 / 9378 / 1352
Регистрация: 21.01.2016
Сообщений: 35,344
19.02.2020, 07:05
Цитата Сообщение от Гречка Посмотреть сообщение
Вы предлагаете создать таблицу запросом.
Нет. Я предлагаю создать эту таблицу. Пофигу как вы это сделаете. Запросом я только возможную схему этой таблицы показываю.

Цитата Сообщение от Гречка Посмотреть сообщение
Только вот проблема то в том что в видео говорится как сделать связь 1:1 между 2 таблицами а у меня их 4.
Да, значит 1:1 у вас уже не получается, сами понимаете почему.
0
0 / 0 / 0
Регистрация: 13.09.2018
Сообщений: 11
19.02.2020, 07:17  [ТС]
Вы говорите что больше 2 таблиц 1:1 я не создам но я это могу спокойно сделать в MS Server. Только мне надо чтобы конечного пользователя не волновало какая там структура данных в бд. Поэтому хочу чтобы если данной структуры не было в бд его создавала программа. И сразу предвижу возражения мол сделай запросы в коде и отправляй в бд. Хочу уметь создавать структуры в бд не только с помощью запросов.
0
Эксперт .NET
 Аватар для Usaga
14293 / 9378 / 1352
Регистрация: 21.01.2016
Сообщений: 35,344
19.02.2020, 07:22
Цитата Сообщение от Гречка Посмотреть сообщение
Вы говорите что больше 2 таблиц 1:1 я не создам но я это могу спокойно сделать в MS Server.
Нет. То, что вы "можете" создать - подчинённые таблицы "шарят" ID родительской. А у вас наоборот: один подчинённый адрес должен "шариться" между тремя родительскими сущностями. Направление связей вывернутое. Это не есть 1:1.

И SQL Server тут ни причём. Схема базы должна и будет парить именно вас, как разработчика. Конечный пользователь тут тоже ни причём. Создадите схему руками или силами EF'а сгенерируете, она всё равно будет неизбежно. Более того: она не обязана быть строго такой, какой описана в EF.

Я вам предлагаю только идею организации этой схемы. Ещё раз: как вы эту схему породите - не играет никакой роли. Будут сущсности, будут связи между ними. С EF'ом или без него.
0
0 / 0 / 0
Регистрация: 13.09.2018
Сообщений: 11
19.02.2020, 07:42  [ТС]
Я понял вашу идею (создать доп. Таблицу асоциации) но разделением одной таблицы на 4 я стремился избавиться от тех столбцов которые не нужны в конкретных записях (что я имею ввиду была изначально одна таблица со всеми данными и ясно что для земельного участка никто указывать количество комнат не будет и т п). Вы предлагаете создать еще одну таблицу когда в одной записи будет храниться id таблицы адреса и id одной из трех типов недвижимости тем самым снова порождая пустые столбцы (из за подобной структуры). Что меня откровенно говоря не устраивает. Если я не правильно вас понял будьте добры объяснить. И вопрос состоит в том как через EF создать структуру описаной мной в начале.
0
Эксперт .NET
 Аватар для Usaga
14293 / 9378 / 1352
Регистрация: 21.01.2016
Сообщений: 35,344
19.02.2020, 07:57
Гречка, нет, вы правильно поняли. На самом деле можно сделать вариант таблицы-связи и без пустых полей, с полиморфным внешним ключом на любое количество таблиц. Но тогда СУБД не сможет гарантировать целостность такого ключа, ибо не будет знать на что ключ указывает. Идея такая:

SQL
1
2
3
4
5
6
7
CREATE TABLE RealEstateAssociation (
    RealEstateId INT NOT NULL,
    AssociatedEntityId INT NOT NULL,
    AssociationgTypeId INT NOT NULL,
    PRIMARY KEY(RealEstateId),
    CONSTRAINT FK_RealEstateAssociation_RealEstate FOREIGN KEY (RealEstateId) REFERENCES RealEstate (Id)
)
Будет какое-то перечисление (AssociationgTypeId), которое будет говорить на что идёт ссылка, и сама ссылка (AssociatedEntityId). На самом деле, такой подход вполне себе жизнеспособный и расширяемый без изменения схемы базы. Только СУБД здесь вам уже не помошник в соблюдении целостности данных.

Может статься, что вам проще адрес хранить в каждой сущности. Может быть используя Table Splitting (EF это умеет из коробки, погуглите). Ну или одна таблица адрес, на которую кто угодно может ссылаться. В конце концов, вы реально видите такую лютую проблему в том, что у некоторых записей будут пустые поля? Вы же базу не на дискете хранить собрались, где каждый байт важен? А вот сложностей вы себе обеспечите совершенно точно)
0
0 / 0 / 0
Регистрация: 13.09.2018
Сообщений: 11
19.02.2020, 09:05  [ТС]
Да, я думал после возникновении этой проблемы, что можно создать одну таблицу и потом разбить тем самым Table Splitting. И к тому же не кажется что это костыль? Но чем больше я искал решения данной проблемы тем больше мне становится интересно почему я не могу сразу создать подобную структуру? Я хочу разобраться в этой ситуации.

И разбиваю не потому что на дискетах хранить данные буду. А по двум причинам: 1) при поиске недвижимости по адресу меньше данных за собой волочить буду при такой структуре что в целом плюс 2) я участвую в world skills и за такую структуру в 3 раза больше баллов начисляют чем нежели я хранил все данные в одной таблице.
0
Эксперт .NET
 Аватар для Usaga
14293 / 9378 / 1352
Регистрация: 21.01.2016
Сообщений: 35,344
19.02.2020, 09:49
Цитата Сообщение от Гречка Посмотреть сообщение
И к тому же не кажется что это костыль?
В чём костыль?

Цитата Сообщение от Гречка Посмотреть сообщение
при поиске недвижимости по адресу меньше данных за собой волочить буду при такой структуре что в целом плюс
Что? Вы, формируя запрос, сразу указываете какие данные вы хотите получить. Как вы можете волочить то, что вам не надо?

Цитата Сообщение от Гречка Посмотреть сообщение
я участвую в world skills и за такую структуру в 3 раза больше баллов начисляют чем нежели я хранил все данные в одной таблице.
А, так проект учебный)
0
0 / 0 / 0
Регистрация: 13.09.2018
Сообщений: 11
19.02.2020, 10:15  [ТС]
Цитата Сообщение от Usaga Посмотреть сообщение
В чём костыль?
то что сначала создается таблица а потом сразу же сплитится
Цитата Сообщение от Usaga Посмотреть сообщение
Вы, формируя запрос, сразу указываете какие данные вы хотите получить.
Перечитал источники по которым учил sql и ms server понял что мое представление о бд было не правильным . так что эта причина отпадает.

И в таком случае все равно не понятно почему я не могу создать такую структуру сразу в EF
0
Эксперт .NET
 Аватар для Usaga
14293 / 9378 / 1352
Регистрация: 21.01.2016
Сообщений: 35,344
19.02.2020, 10:40
Цитата Сообщение от Гречка Посмотреть сообщение
то что сначала создается таблица а потом сразу же сплитится
Это сразу создание двух таблиц со связями один-к-одному. Просто вынос полей, которые часто пусты. Никаких костылей в этом нет.

Цитата Сообщение от Гречка Посмотреть сообщение
И в таком случае все равно не понятно почему я не могу создать такую структуру сразу в EF
Потому, что вы описали что-попало. Иерархия (неправильная), каждый член в которой и ссылается и наследуется от базового типа. Правда, ерунда полнейшая.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
19.02.2020, 10:40
Помогаю со студенческими работами здесь

Связь многие-ко-многим в Entity Framework
делаю задания с моделями сущностей entity framework. на примере студентов и курсов, у каждого студента может быть несколько курсов, как и у...

Entity Framework - связь через интерфейсы
привет подскажите как можно реализовать interface IPerson class student:IPerson class Teacher:IPerson class shcool ...

Связь многие ко многим (Entity Framework)
Мне нужна связь многие ко многим. Нашел вот тут хороший туториал который объясняет как ее сделать на Entity Framework. Но не понятно что...

Entity Framework и связь одной таблицы со многими
Здравствуйте, форумчане. Преамбула: Поставили задачу такой направленности: автоматизировать работу склада. Нет, автоматизировать -...

Отношение между несколькими таблицами
Привет всем. Тема в принципе похожа на предыдущую, но все же отличается. Итак, есть три таблицы - Data, History, TypeHistory. Data,...


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

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Новые блоги и статьи
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка SDL3 и Box2D из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru