EF 4.1 Code First Отображение двух столбцов в одной таблице в список - PullRequest
2 голосов
/ 03 июля 2011

У меня проблема с выяснением, как заставить это работать для EF 4.1 Code First. Я огляделся и обнаружил похожую проблему , но я не смог заставить ее работать на меня, и похоже, что и для этого человека ответа не последовало.

Вот упрощенная версия двух рассматриваемых объектов.

public class Team
{
  public int TeamId {get; set;}
  public virtual IList<Game> Games {get; set;}
}

public class Game
{
  public int GameId {get; set; }
  public int AwayTeamId {get; set;}
  public int HomeTeamId {get; set;}

  public virtual Team HomeTeam { get; set; }
  public virtual Team AwayTeam { get; set; }  
}

А вот и мой код для регистрации ФК

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    modelBuilder.Entity<Game>()
        .HasRequired(a => a.HomeTeam)
        .WithMany()
        .HasForeignKey(u => u.HomeTeamId).WillCascadeOnDelete(false);

    modelBuilder.Entity<Game>()
        .HasRequired(a => a.AwayTeam)
        .WithMany()
        .HasForeignKey(u => u.AwayTeamId).WillCascadeOnDelete(false);
}

Я хочу вернуть все игры (дома или в гостях), в которых участвует команда. Сейчас EF создает столбец TeamId в моей базе данных, который никогда не заполняется. Если то, что я хочу, невозможно, то я мог бы составить списки HomeGames и AwayGames и другой список игр, представляющий собой комбинацию из двух, но я хотел бы попытаться избежать этого, если это возможно. Я все еще изучаю это, поэтому любые дополнительные объяснения или советы будут оценены.

Ответы [ 2 ]

1 голос
/ 03 июля 2011

То, что вы спрашиваете об EF, - это коллекция только для чтения, т. Е. Операция добавления была бы бессмысленной для такой коллекции, поскольку EF не знала бы, в какую таблицу вставлять, что, я считаю, не поддерживается.

Судя по описанию вашей проблемы, я бы сделал нечто похожее на ваше собственное предложение и создал бы метод, такой как GetGames (), который бы возвращал только объединенный набор как домашних, так и выездных игр.Я думаю, что в любом случае это концептуально чище.

0 голосов
/ 03 июля 2011

EF не может отобразить два отношения в одно свойство навигации. Ваш дополнительный столбец TeamId создан, потому что свойство навигации Games рассматривается как отдельное отношение (ваше сопоставление говорит, что ни HomeTeam, ни AwayTeam не являются частью этого отношения), поэтому вы поручили EF создать три отношения для вашего.

Вы должны определить свою модель следующим образом:

public class Team
{
  public int TeamId {get; set;}
  public virtual ICollection<Game> HomeGames { get; set; }
  public virtual ICollection<Game> AwayGames { get; set; }
}

И отображение должно быть:

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    modelBuilder.Entity<Game>()
        .HasRequired(a => a.HomeTeam)
        .WithMany(t => t.HomeGames)
        .HasForeignKey(u => u.HomeTeamId).WillCascadeOnDelete(false);

    modelBuilder.Entity<Game>()
        .HasRequired(a => a.AwayTeam)
        .WithMany(t => t.AwayGames)
        .HasForeignKey(u => u.AwayTeamId).WillCascadeOnDelete(false);
}

Теперь, если вам нужны игры всех команд, вы можете просто использовать:

var games = team.HomeGames.Concat(team.AwayGames);

Вы можете заключить это в метод, возвращающий IEnumerable, или в свойство, просто вернув геттер IEnumerable.

...