c# сущностей Entity Framework Code First-два внешних ключа из одной таблицы




ошибка при сохранении сущностей не обеспечивающих доступ к свойствам внешнего ключа для их связей (4)

Сначала я начал использовать 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() свойства навигации:

[ForeignKey("HomeTeamID")]
public virtual Team HomeTeam { get; set; }
[ForeignKey("GuestTeamID")]
public virtual Team GuestTeam { get; set; }

Таким образом, вам не нужно добавлять какой-либо код в метод OnModelCreate


Я знаю, что это несколько лет назад, и вы можете решить свою проблему с помощью вышеупомянутого решения. Тем не менее, я просто хочу предложить использовать InverseProperty для тех, кто все еще нуждается. По крайней мере, вам не нужно ничего менять в OnModelCreating.

Следующий код не проверен.

public class Team
{
    [Key]
    public int TeamId { get; set;} 
    public string Name { get; set; }

    [InverseProperty("HomeTeam")]
    public virtual ICollection<Match> HomeMatches { get; set; }

    [InverseProperty("GuestTeam")]
    public virtual ICollection<Match> GuestMatches { get; set; }
}


public class Match
{
    [Key]
    public int MatchId { 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; }
}

Вы можете больше узнать о InverseProperty в MSDN: https://msdn.microsoft.com/en-us/data/jj591583?f=255&MSPPError=-2147217396#Relationships


Это связано с тем, что Cascade Deletes включены по умолчанию. Проблема заключается в том, что при вызове delete в сущности он также удаляет все связанные с f-key объекты. Вы не должны указывать обязательные значения, чтобы устранить эту проблему. Лучшим вариантом было бы удалить EF Code First's Cascade delete:

modelBuilder.Conventions.Remove<OneToManyCascadeDeleteConvention>(); 

Вероятно, безопаснее явно указывать, когда делать каскадное удаление для каждого из детей при сопоставлении / config. лицо.


Вы можете попробовать это тоже:

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; }
}

Когда вы делаете столбец FK, разрешите NULLS, вы нарушаете цикл. Или мы просто обманываем генератор схемы EF.

В моем случае эта простая модификация решает проблему.





entity-framework-4.1