1

Тема: Помилка циклічності моделі БД

Ось шматочок з моєї БД, створеної по принципу code first:
Є абстрактний клас Client (саме його таблиця створюється в БД):

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 класи:

public class PrivatePerson : Client // дядя Вася
    {
        public string PrivatePersonSurname { get; set; }
    }
    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; } // адреса установи
    }

і аналогічна фірмі Рекламна агенція

    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; } // адреса установи
    }

Ось таблиця Адреси клієнта:

    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; } // примітка
    }

Контекст:

public virtual DbSet<Client> Clients { get; set; }
public virtual DbSet<ClientAddress> ClientAddresses { get; set; }

Так от. Коли я намагаюся створити БД, мені видає ось такий Exception:

System.Data.SqlClient.SqlException
  HResult=0x80131904
  Message=Introducing FOREIGN KEY constraint 'FK_dbo.Clients_dbo.ClientAddresses_FirmAddress_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

Re: Помилка циклічності моделі БД

Для довідки. Спочатку (оскільки поля Рекламного агенства (РА) повністю співпадали з полями Фірми) я просто РА унаслідував від Фірми (public class AdvertisingAgency : Firm) і база створювалась без проблем. Але в такому випадку я не міг додавати екземпляр РА в таблицю Clients. Відповідно, я змінив наслідування і вуаля

3

Re: Помилка циклічності моделі БД

boshik1983 написав:

Ось шматочок з моєї БД, створеної по принципу code first:
Є абстрактний клас Client (саме його таблиця створюється в БД):

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 класи:

public class PrivatePerson : Client // дядя Вася
    {
        public string PrivatePersonSurname { get; set; }
    }
    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; } // адреса установи
    }

і аналогічна фірмі Рекламна агенція

    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; } // адреса установи
    }

Ось таблиця Адреси клієнта:

    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; } // примітка
    }

Контекст:

public virtual DbSet<Client> Clients { get; set; }
public virtual DbSet<ClientAddress> ClientAddresses { get; set; }

Так от. Коли я намагаюся створити БД, мені видає ось такий Exception:

System.Data.SqlClient.SqlException
  HResult=0x80131904
  Message=Introducing FOREIGN KEY constraint 'FK_dbo.Clients_dbo.ClientAddresses_FirmAddress_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.


Хтосб може допомогти розібратися?

Вам же ясно написано - у вас ціклічні посилання  на зовнішні ключі. Що не дивно бо ви спочатку створюєте таблицю кліентів, заводите на неї зовнішній ключ у таблиці адреси, а потім навіщось створюєте зовнішній ключ на таблицю адреси у таблиці фірм. (у мене аж пальці заплутались це писати). то ж або преберіть каскадне видалення та апдейти, та працюйте як у фокспро, або зробіть нормальну структуру БД.

Робіть що хочете - людина створена вільною
Подякували: 221VOLT, koala, leofun013

4

Re: Помилка циклічності моделі БД

спочатку створюєте таблицю кліентів, заводите на неї зовнішній ключ у таблиці адреси

Можете мені пальцем тикнути, де в таблиці Адреси зовнішній ключ на таблицю Клієнти, бо я такий тупий, що не бачу?

5

Re: Помилка циклічності моделі БД

Прихований текст
той момент коли заходиш в тему, створену в "бази даних"

очікуєш побачити тут якийсь sql

бачиш якийсь ооп

* починає бігати по кімнаті з криками "аааа вони хочуть зїсти всі наші мізки" *

https://blog.clever-games.win/
Це ще не кінець. Це навіть не початок кінця. Але, можливо, це кінець початку.
Зростання мудрості можна точно вимірювати ступенем зменшення злоби.
///// у творчій відпустці. не турбувати /////
Подякували: koala, ostap34PHP, varkon, Fox4

6

Re: Помилка циклічності моделі БД

Як закрити тему підкажіть, будь ласка.