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

Ошибка цикличности модели БД

20.12.2017, 18:31. Показов 1743. Ответов 12

Студворк — интернет-сервис помощи студентам
Огромная просьба не кидать мне в ответах ссылки на похожие темы и теорию.
Меня просто застопорило и я что-то не могу понять где проблема (где зациклило)

Вот кусочек моей БД, созданной по принципу code first:
Есть абстрактный класс Client (именно его таблица создаётся в БД):
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
    public abstract class Client
        {
            public int ClientId { get; set; }
     
            [Required(ErrorMessage = "Name is required for Client")]
            public string ClientName { get; set; }
     
            [Required(ErrorMessage = "Phone number is required for Client")]
            public string ClientPhoneNumber { get; set; }
     
            public string Email { get; set; }
     
            public string Comment { get; set; }
     
            [Required(ErrorMessage = "Client should be enabled or disabled")]
            public bool IsDisabled { get; set; }
        }
От него унаследуются 3 класса:
1)
C#
1
2
3
4
    public class PrivatePerson : Client // дядя Вася
        {
            public string PrivatePersonSurname { get; set; }
        }
2)
C#
1
2
3
4
5
6
7
8
        public class Firm : Client
        {
            [Required(ErrorMessage = "Ownership is required for Firm")]
            public virtual Ownership Ownership { get; set; }
     
            [Required(ErrorMessage = "Client address is required for Firm")]
            public virtual ClientAddress FirmAddress { get; set; }
        }
3) и аналогичное Фирме Рекламное агентство

C#
1
2
3
4
5
6
7
8
        public class AdvertisingAgency : Client
        {
            [Required(ErrorMessage = "Ownership is required for Advertising agency")]
            public virtual Ownership Ownership { get; set; }
     
            [Required(ErrorMessage = "Client address is required for Advertising agency")]
            public virtual ClientAddress AdvertisingAgencyAddress { get; set; }
        }
Вот таблица Адреса клиента:

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
        public class ClientAddress
        {
            public int ClientAddressId { get; set; }
     
            [Required(ErrorMessage = "Postal code is required for Client Address")]
            public int PostalCode { get; set; }
     
            [Required(ErrorMessage = "City is required for Client Address")]
            public virtual City ClientCity { get; set; }
     
            public int POBox { get; set; }
     
            public virtual Street ClientStreet { get; set; }
     
            public string StreetNumber { get; set; }
     
            public int Appartment { get; set; }
     
            public string ClientAddressComment { get; set; }
        }
Контекст (часть):

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
    public class FivePlusDBContext : DbContext
    {
        public FivePlusDBContext() : base("name = FivePlus")
        {
        }
 
        public virtual DbSet<City> Cities { get; set; }
        public virtual DbSet<Street> Streets { get; set; }
 
        public virtual DbSet<Client> Clients { get; set; }
        public virtual DbSet<ClientAddress> ClientAddresses { get; set; }
 
        public virtual DbSet<Ownership> Ownerships { get; set; }
    }
Так вот. Когда я пытаюсь создать БД, мне выдаёт вот такой Exception:

System.Data.SqlClient.SqlException
HResult=0x80131904
Message=Introducing FOREIGN KEY constraint 'FK_dbo.Clients_dbo.ClientAddresses_Firm Address_ClientAddressId' on table 'Clients' may cause cycles or multiple cascade paths. Specify ON DELETE NO ACTION or ON UPDATE NO ACTION, or modify other FOREIGN KEY constraints.
Could not create constraint or index. See previous errors.

Ткните мне балбесу, пожалуйста, пальцем в место ошибки.
П.С. Раньше было немножко иначе и всё работало, а потом увидел ошибку, переделал, заболел, а через 2 дня вернулся к коду и хоть убей не могу понять в чем проблема.

Спасибо заранее.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
20.12.2017, 18:31
Ответы с готовыми решениями:

Вопрос о цикличности
Есть программа с начальным выбором действия: cout &lt;&lt; &quot;1. Add, 2.Search, 3.Exit&quot; &lt;&lt; endl; и далее мне нужно сделать так, чтобы в будущем...

Разбить массив на тройки с элементами цикличности
Что-то никак не соображу. Помогите. Нужно разбить список на тройки. Количество троек - по количеству элементов. При этом каждый элемент...

При выводе цикличности не повторяет строку с именем автора
Доброго времени суток , столкнулся с такой проблем что все повторяет в цикличности а строку с автором нет точнее переменную автора , что...

12
Эксперт .NET
 Аватар для Usaga
14313 / 9393 / 1355
Регистрация: 21.01.2016
Сообщений: 35,424
20.12.2017, 18:39
boshik1983, видимо маппинг у вас с ошибкой производится. И что, у частного лица не может быть адреса?
0
4 / 4 / 1
Регистрация: 16.06.2016
Сообщений: 21
20.12.2017, 18:50  [ТС]
Программа пишется под фирму, владеющую сеть рекламных конструкций
Проблема в том, что под частным лицом подразумевается дядя Вася, который прибежал, указал пальцем место, где должна быть его реклама (или просто поздравление жены с ДР), дал денег и свалил. У него может быть адрес, но не обязательно (и как мне сказали, в 100% случаев фирма не знает этого адреса), о вот для разных там учреждений, компаний, предпринимателей... адрес обязателен, поскольку им высылаются счета и акты.
Если я укажу поле адреса в классе Client, то: 1) либо дяде Васе нужно будет выдумывать адрес (если поле обязательное), 2) либо возможен будет вариант создания клиента-предприятия без адреса (если поле не обязательное), что очень нежелательно
0
Эксперт .NET
 Аватар для Usaga
14313 / 9393 / 1355
Регистрация: 21.01.2016
Сообщений: 35,424
20.12.2017, 18:52
3) Контролировать наличие адреса на уровне бизнес-логики.

Добавлено через 36 секунд
Вы бы показали, как мапинг производите.
0
4 / 4 / 1
Регистрация: 16.06.2016
Сообщений: 21
20.12.2017, 19:02  [ТС]
Мапинг никак не производится. Всё оддал в руки EntityFramework:
Создал классы со свойствами, создал Контекс (часть его выложил), а дальше, если надо внести запись или чего, то делаю следущее:

C#
1
2
3
4
5
6
using (var ctx = new FivePlusDBContext())
            {
                City C_1 = new City() { CityName = "Имя" };
                ctx.Cities.Add(C_1);
                ctx.SaveChanges();
            }
Одну запись внёс и вся база развернулась
0
Эксперт .NET
 Аватар для Usaga
14313 / 9393 / 1355
Регистрация: 21.01.2016
Сообщений: 35,424
20.12.2017, 19:04
boshik1983, вы иерархию классов соорудили. Такое требует настройки, чтобы EF знал как это реализовать: TPH, TPT или TPC. "Из коробки" такое само не заработает. Или сделайте всё на базе одного класса или настройте маппинг.
0
Эксперт .NET
 Аватар для insite2012
5548 / 4311 / 1218
Регистрация: 12.10.2013
Сообщений: 12,371
Записей в блоге: 2
20.12.2017, 19:07
Цитата Сообщение от Usaga Посмотреть сообщение
вы иерархию классов соорудили.
И довольно странную иерархию, я бы заметил. От человека наследуется фирма и рекламное агентство - это очень странно, я бы сказал. Я бы советовал продумать иерархию и уточнить ее.
0
Эксперт .NET
 Аватар для Usaga
14313 / 9393 / 1355
Регистрация: 21.01.2016
Сообщений: 35,424
20.12.2017, 19:08
insite2012, нет, тут всё нормально. Наследие идёт от "клиента". А это или юрлицо или физхаря.
0
Эксперт .NET
 Аватар для insite2012
5548 / 4311 / 1218
Регистрация: 12.10.2013
Сообщений: 12,371
Записей в блоге: 2
20.12.2017, 19:12
Цитата Сообщение от Usaga Посмотреть сообщение
нет, тут всё нормально.
А я так не думаю. Далее идет раздвоение-от клиента происходят и фирмы, и частное лицо, мне кажется что все равно не совсем то что следовало бы.
0
Эксперт .NET
 Аватар для Usaga
14313 / 9393 / 1355
Регистрация: 21.01.2016
Сообщений: 35,424
20.12.2017, 19:15
insite2012, да вполне себе. "Клиент" же абстрактен. А физлицо != фирма. Как бы нормально. Другое дело, что физлицо - бомж, если судить по данной модели))
0
Эксперт .NET
 Аватар для insite2012
5548 / 4311 / 1218
Регистрация: 12.10.2013
Сообщений: 12,371
Записей в блоге: 2
20.12.2017, 19:17
Цитата Сообщение от Usaga Посмотреть сообщение
да вполне себе. "Клиент" же абстрактен.
Я бы, наверное, все же развел на две иерархии-физические и юридические лица, и далее уже по нарастающей сформировал. Но ТС виднее, пусть делает как удобнее)))
На мой взгляд, тут все же нарушение Interface Segregation Principle-частное лицо имеет (и зависит от) то, что ему и даром не нужно.
0
Эксперт .NET
 Аватар для Usaga
14313 / 9393 / 1355
Регистрация: 21.01.2016
Сообщений: 35,424
20.12.2017, 19:21
insite2012, ну не знаю. Я вижу, что и физлицо и юрлицо - оба клиенты. А разведение специфичных свойств вполне себе укладыватеся в эту иерархию.
0
4 / 4 / 1
Регистрация: 16.06.2016
Сообщений: 21
20.12.2017, 19:22  [ТС]
Ребята всем спасибо. Ответ нашелся. Короче фишка вот в чём (и я это знал, но затмение нашло):
Я создаю таблицу от базового класса. При этом эта таблица втягивает все поля классов-наследником. И тут получается, что в таблице будут существовать 2 foreign key, при этом каскадное удаление я не отменил (что можно сделать в мапинге).
Варианта решения проблемы 3:
1) Настроить мапинг и запретить каскадное удаление
2) Создать таблицы для каждого класса-наследника, а не одну таблицу базового класса
3) Перенести поле Адреса в базовый класс и контролировать его в бизнес логике.

Огромное спасибо всем.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
20.12.2017, 19:22
Помогаю со студенческими работами здесь

Ошибка в модели данных
Всем привет! Составила логическую схему. Преподаватель сказал, что ошибка в модели данных. Подскажите, пожалуйста, где ошибка. ...

Ошибка работы с очередью модели
Не могу разобраться в чём ошибка. Условие такое: есть 10 устройств которые обслуживают заявки 3 типов. Заявок первого типа максимум может...

Ошибка перемещения агентов в иерархической модели
Доброго времени суток! Есть иерархическая модель, в которой есть два типа агентов города и люди, люди обитают в городах и по отношению...

Ошибка при запуске модели АД с КЗ ротором
Модель АД с КЗ ротором связан с ДП тока для снятия механической характеристики. Модель взята из источника &quot;Герман-Галкин С Г -...

Где может быть ошибка в модели
Есть задача Бригаде из 10 грузчиков нужно перетащить 50 вещей. каждую вещь они могут переносить за 15 плюс-минус 5 минут. Причем среди...


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

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Новые блоги и статьи
Отправка уведомления на почту при изменении наименования справочника
Maks 24.03.2026
Программная отправка письма электронной почты на примере изменения наименования типового справочника "Склады" в конфигурации БП3. Перед реализацией необходимо выполнить настройку системной учетной. . .
модель ЗдравоСохранения 5. Меньше увольнений- больше дохода!
anaschu 24.03.2026
Теперь система здравосохранения уменьшает количество увольнений. 9TO2GP2bpX4 a42b81fb172ffc12ca589c7898261ccb/ https:/ / rutube. ru/ video/ a42b81fb172ffc12ca589c7898261ccb/ Слева синяя линия -. . .
Midnight Chicago Blues
kumehtar 24.03.2026
Такой Midnight Chicago Blues, знаешь?. . Когда вечерние улицы становятся ночными, а ты не можешь уснуть. Ты идёшь в любимый старый бар, и бармен наливает тебе виски. Ты смотришь на пролетающие. . .
Контроль уникальности заводского номера - вариант №2
Maks 24.03.2026
В отличие от предыдущего варианта добавлено прерывание циклов, также добавлены новые переменные для сохранения контекста ошибки перед прерыванием цикла: Процедура ПередЗаписью(Отказ, РежимЗаписи,. . .
SDL3 для Desktop (MinGW): Вывод текста со шрифтом TTF с помощью библиотеки SDL3_ttf на Си и C++
8Observer8 24.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-text-sdl3-c. zip finish-text-sdl3-cpp. zip
Жизнь в неопределённости
kumehtar 23.03.2026
Жизнь — это постоянное существование в неопределённости. Например, даже если у тебя есть список дел, невозможно дойти до точки, где всё окончательно завершено и больше ничего не осталось. В принципе,. . .
Модель здравоСохранения: работники работают быстрее после её введения.
anaschu 23.03.2026
geJalZw1fLo Корпорация до введения программа здравоохранения имела много невыполненных работниками заданий, после введения программы количество заданий выросло. Но на выплатах по больничным это. . .
Контроль уникальности заводского номера - вариант №1
Maks 23.03.2026
Алгоритм контроля уникальности заводского (или серийного) номера на примере нетипового документа выдачи шин для спецтехники с табличной частью, разработанного в конфигурации КА2. Данные берутся из. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru