Я пытаюсь выполнить следующие миграции 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
.
Я понимаю, что возникла проблема с циркулярным штуковина. Исходя из моей интуиции, программа не знает, что делать в случае удаления пользователя, понижать или нет его рейтинги и квартиры или что-то в этом роде, и поэтому она так себя ведет, но я не могу исправить проблема.
У меня вопрос: как я могу решить эту проблему, поскольку я не могу создать свою базу данных и, следовательно, не могу продолжать работу над проектом.
Спасибо!
Вы вызываете циклическую ссылку, добавляя Пользователь и Квартира к объекту Рейтинги. Сущности Пользователь и Квартира уже имеют отношение «один ко многим» с коллекцией Рейтинги.
'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; }
}
Почему таблица рейтинга должна быть такой? У него не было бы никакой связи с другими таблицами, если бы он, по крайней мере, не реализовывал свойства навигации. Мне нужна таблица рейтингов, потому что пользователь может оставить оценку для квартиры, и мне нужно определить, оценил он квартиру или нет, чтобы предотвратить его завышение. В любом случае спасибо за помощь.
Вам нужно будет сделать отношения пользователя необязательными в одной из таблиц, например:
public int? UserId { get; set; }
Если сделать тип свойства обнуляемым, EF сообщит, что каскадное удаление здесь не требуется.
Это работает. Я где-то читал о том, как сделать FK допускающим значение NULL, но я не был в этом уверен. Надо было попробовать с самого начала, но, по крайней мере, другие люди увидят этот вопрос и тоже решат свою проблему. Большое спасибо! Помечено как ответ.
@vladel дайте мне знать, исправит ли мое предложение ошибку EF.