Я только начал использовать код EF, поэтому я начинающий в этой теме.
Я хотел создать отношения между командами и матчами:
1 матч = 2 команды (дома, гость) и результат.
Я думал, что легко создать такую модель, поэтому я начал кодировать:
public class Team
{
[Key]
public int TeamId { get; set;}
public string Name { get; set; }
public virtual ICollection<Match> Matches { get; set; }
}
public class Match
{
[Key]
public int MatchId { get; set; }
[ForeignKey("HomeTeam"), Column(Order = 0)]
public int HomeTeamId { get; set; }
[ForeignKey("GuestTeam"), Column(Order = 1)]
public int GuestTeamId { get; set; }
public float HomePoints { get; set; }
public float GuestPoints { get; set; }
public DateTime Date { get; set; }
public virtual Team HomeTeam { get; set; }
public virtual Team GuestTeam { get; set; }
}
И я получаю исключение:
Ссылочные отношения приведут к циклической ссылке, которая не допускается. [Имя ограничения = Match_GuestTeam]
Как я могу создать такую модель с двумя внешними ключами к одной таблице?
Также можно указать
ForeignKey()
атрибут в свойстве навигации:Таким образом, вам не нужно добавлять код в
OnModelCreate
методисточник
OnModelCreate
согласно принятому ответу, а также две коллекции для обеих сторон отношений.Я знаю, что это пост несколько лет, и вы можете решить свою проблему с помощью вышеуказанного решения. Тем не менее, я просто хочу предложить использовать InverseProperty для тех, кто все еще нуждается. По крайней мере, вам не нужно ничего менять в OnModelCreating.
Код ниже не протестирован.
Подробнее об InverseProperty можно прочитать в MSDN: https://msdn.microsoft.com/en-us/data/jj591583?f=255&MSPPError=-2147217396#Relationships
источник
Вы можете попробовать это тоже:
Когда вы делаете столбец FK разрешить NULLS, вы прерываете цикл. Или мы просто обманываем генератор схемы EF.
В моем случае эта простая модификация решит проблему.
источник
Это связано с тем, что каскадные удаления включены по умолчанию. Проблема в том, что когда вы вызываете delete для объекта, он удаляет также все объекты, на которые ссылается f-key. Вы не должны делать «обязательные» значения обнуляемыми, чтобы решить эту проблему. Лучшим вариантом было бы удалить соглашение EF Code First каскадного удаления:
Вероятно, безопаснее явно указать, когда выполнять каскадное удаление для каждого из дочерних элементов при отображении / конфигурации. организация.
источник
Restrict
вместоCascade
?InverseProperty
в EF Core делает решение простым и понятным.InverseProperty
Таким образом, желаемое решение будет:
источник