"FK_Ratings_Users_UserId" в таблице "Рейтинги" может вызвать циклы или несколько каскадных путей

Я пытаюсь выполнить следующие миграции Code-First в .NET EFCore через указанные ниже объекты.

Пользователь

[Table("Users")]
public class User
{
    [Key]
    public int Id { get; set; }

    [Required]
    [MaxLength(100)]
    public string FirstName { get; set; }

    [Required]
    [MaxLength(100)]
    public string LastName { get; set; }

    [Required]
    [MaxLength(250)]
    public string Email { get; set; }

    [Required]
    [MinLength(8), MaxLength(16)]
    public string Password { get; set; }

    [Required]
    [MinLength(6), MaxLength(15)]
    public string Phone { get; set; }

    public ICollection<Apartment> Apartments { get; set; }

    public ICollection<Rating> Ratings { get; set; }
}

Квартира

[Table("Apartments")]
public class Apartment
{
    [Key]
    public int Id { get; set; }

    [Required]
    [MinLength(24), MaxLength(100)]
    public string Title { get; set; }

    [Required]
    [MinLength(24), MaxLength(250)]
    public string Address { get; set; }

    [Required]
    public int Price { get; set; }

    [ForeignKey("User")]
    public int UserId { get; set; }

    public User User {get; set;}

    public ICollection<Rating> Ratings { get; set; }

    public ICollection<AptCateg> AptsCategs { get; set; }
}

Рейтинги

[Table("Ratings")]
public class Rating
{
    [Key]
    public int Id { get; set; }

    public int Value { get; set; }

    [ForeignKey("Apartment")]
    public int ApartmentId { get; set; }

    public Apartment Apartment { get; set; }

    [ForeignKey("User")]
    public int UserId { get; set; }

    public User User { get; set; }
}

Я использую команды dotnet ef migrations add InitialDatabase, но когда я пытаюсь использовать dotnet ef database update, он выдает следующую ошибку в cmd, как в заголовке

'FK_Ratings_Users_UserId' on table 'Ratings' may cause cycles or multiple cascade paths

Я попытался добавить, как в учебнике EFCore из здесь, каскадное поведение modelBuilder, но оно не работает, потому что я получаю ту же ошибку. Я также попытался ответить от здесь, но реализация для HasRequired не работает, даже если попытаться установить EntityFrameworkCore.Tools.

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

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

Спасибо!

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
33
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Вы вызываете циклическую ссылку, добавляя Пользователь и Квартира к объекту Рейтинги. Сущности Пользователь и Квартира уже имеют отношение «один ко многим» с коллекцией Рейтинги.

'FK_Ratings_Users_UserId' on table 'Ratings' may cause cycles or multiple cascade paths

Вот так должна выглядеть сущность Рейтинги:

[Table("Ratings")]
public class Rating
{
    [Key]
    public int Id { get; set; }

    public int Value { get; set; }
}

@vladel дайте мне знать, исправит ли мое предложение ошибку EF.

Mihaela Diaconu 12.09.2018 16:55

Почему таблица рейтинга должна быть такой? У него не было бы никакой связи с другими таблицами, если бы он, по крайней мере, не реализовывал свойства навигации. Мне нужна таблица рейтингов, потому что пользователь может оставить оценку для квартиры, и мне нужно определить, оценил он квартиру или нет, чтобы предотвратить его завышение. В любом случае спасибо за помощь.

Vlădel 13.09.2018 08:22
Ответ принят как подходящий

Вам нужно будет сделать отношения пользователя необязательными в одной из таблиц, например:

public int? UserId { get; set; }

Если сделать тип свойства обнуляемым, EF сообщит, что каскадное удаление здесь не требуется.

Это работает. Я где-то читал о том, как сделать FK допускающим значение NULL, но я не был в этом уверен. Надо было попробовать с самого начала, но, по крайней мере, другие люди увидят этот вопрос и тоже решат свою проблему. Большое спасибо! Помечено как ответ.

Vlădel 13.09.2018 08:23

Другие вопросы по теме