EF множественные отношения между сущностями - PullRequest
1 голос
/ 27 марта 2012

Я использую подход Code First для создания базы данных в этой проблеме. У меня есть следующая (частичная) сущность:

public class Tournament {
    public int TournamentID { get; set; }
    public String Name { get; set; }
    public DateTime? StartDate { get; set; }
    public DateTime? EndDate { get; set; }
    public int? SportID { get; set; }

    public virtual Sport Sport { get; set; }

    public virtual ICollection<Official> Officials { get; set; }
}

В официальном юридическом лице у меня есть это:

public class Official {
    public int OfficialID { get; set; }
    public String Surname { get; set; }
    public String FirstName { get; set; }
    public int? TournamentID { get; set; }

    public virtual Tournament Tournament { get; set; }

    public virtual ICollection<Match> Matches { get; set; }
}

Используя некоторые примеры данных и проверяя базу данных SQL Server, это работает так, как я и ожидал. Турнир имеет отношения один-ко-многим с официальными лицами.

Проблема, с которой я столкнулся, заключается в том, что я бы хотел, чтобы в турнире первичным ключом был официальный представитель. Поэтому я бы добавил к сущности Турнира:

public int? OfficialID { get; set; } // foreign key to official table
public virtual Official HeadOfficial { get; set; } // navigation property

Если я сделаю это, я получу атрибут OfficialID и HeadOfficial_OfficialID в моей таблице Турнира, и я получу TournamentID, Tournament_TournamentID и Tournament_TournamentID1 в моей таблице Официальных лиц. Я понимаю, что теперь у меня не только отношения один-ко-многим между Турниром и Официальным (поскольку в турнире может быть много официальных лиц), но и отношения один-к-одному (поскольку в турнире может быть только одна голова официальный).

Как я могу исправить эту проблему?

1 Ответ

3 голосов
/ 27 марта 2012

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

public class Tournament {
    public int TournamentID { get; set; }
    //...

    public int? OfficialID { get; set; }
    [ForeignKey("OfficialID")]
    public virtual Official HeadOfficial { get; set; }

    [InverseProperty("Tournament")] // the navigation property in Official class
    public virtual ICollection<Official> Officials { get; set; }
}

Это также возможно с Fluent API, если вы предпочитаете:

modelBuilder.Entity<Tournament>()
    .HasOptional(t => t.HeadOfficial)
    .WithMany()
    .HasForeignKey(t => t.OfficialID);

modelBuilder.Entity<Tournament>()
    .HasMany(t => t.Officials)
    .WithOptional(o => o.Tournament)
    .HasForeignKey(o => o.TournamentID);
...