Создание одного ко многим с таблицей ассоциации в Entity Framework - PullRequest
0 голосов
/ 01 июля 2018

У меня есть таблица ассоциации под названием SportTeams:

public class SportTeam
{
        int SportId;
        int TeamId;
        Sport Sport;
        Team Team
}

public class Sport
{
    ICollection<SportTeam> SportTeams;
}

public class Team
{
    ICollection<SportTeam> SportTeams;
}

Я отмечаю это как таблицу ассоциаций через свободный API

modelBuilder.Entity<SportTeam>().HasKey(q => new { q.SportId,q.TeamId }); // set the primary key of the table
modelBuilder.Entity<SportTeam>().HasRequired(s => s.Team).WithMany(t => t.SportTeams).HasForeignKey(s => s.TeamId);
modelBuilder.Entity<SportTeam>().HasRequired(s => s.Sport).WithMany(s => s.SportTeams).HasForeignKey(s => s.SportId);

Теперь мне нужно создать один ко многим с таблицей ассоциации SportTeams. Давайте назовем эту таблицу Matches.

public class Matches
{
    int Id;
    int SportTeamId;
    SportTeam SportTeam;
}

public class SportTeam
{
    int SportId ;
    int TeamId;
    Sport Sport;
    Team Team;

    ICollection<Match> Matches;
}

Я возвращаюсь к беглому API, чтобы внести изменения для этого для многих.

Я говорю

modelBuilder.Entity<SportTeam>().HasMany(st => st.Matches).WithRequired(matches => matches.SportTeam).HasForeignKey(m => m.SportTeamId).WillCascadeOnDelete(false);

Я получаю ошибку:

Количество свойств в зависимых и основных ролях в ограничении отношений должно быть одинаковым.

Я полагаю, что эта ошибка говорит о том, что мой sportTeam PK является составным ключом, и в моем разделе HasForeignKey я просто указываю один FK для подключения.

Как мне поступить в этой ситуации?

1 Ответ

0 голосов
/ 01 июля 2018

Неправильно настраивается перевыбор между SportTeam и Matches. Итак, вы говорите, что у сущности SportTeam может быть много Matches, тогда логично, что у сущности Matches есть внешний ключ, который ссылается на сущность SportTeam.

Но если вы посмотрите на вашу SportTeam конфигурацию сущности, вы скажете, что в качестве первичного ключа она имеет составной ключ (SportId, TeamId).

Вы получаете эту ошибку:

Количество свойств в зависимых и основных ролях в ограничение отношений должно быть идентичным.

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

Итак, чтобы решить эту проблему, ваша Matches сущность должна выглядеть так:

public class Matches
{
    public int Id  { get; set; }

    // these two properties below represent the foreign key that refers to SportTeam entity.
    public int SportId { get; set; }
    public int TeamId { get; set; }

    public SportTeam SportTeam { get; set; };
}

В методе OnModelCreating вы должны иметь следующую строку:

modelBuilder.Entity<SportTeam>()
            .HasMany(st => st.Matches)
            .WithRequired(matches => matches.SportTeam)
            .HasForeignKey(m => new { m.SportId, m.TeamId }) // <-- the composite foreign keys.
            .WillCascadeOnDelete(false);

Вместо:

modelBuilder.Entity<SportTeam>()
            .HasMany(st => st.Matches)
            .WithRequired(matches => matches.SportTeam)
            .HasForeignKey(m => m.SportTeamId)
            .WillCascadeOnDelete(false);

Примечание 1:

Я всегда избегаю использования составного внешнего ключа. Если в результате я получу такие вещи, как у вас, я просто добавлю свойство первичного ключа Id в SportTeam сущность и создадим пару свойств SportId и TeamId с уникальным ограничением в базе данных.

Примечание 2:

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

...