Как я могу запросить объекты внешнего ключа, используя Entity Framework? - PullRequest
0 голосов
/ 07 февраля 2019

Я пытаюсь узнать о Entity Framework 6 и столкнулся с проблемой, которую мне удалось воспроизвести в тестовом проекте:

A Movie имеет Name иRevenue.Revenue имеет GrossIncome:

public class Movie
{
        [Key]
        public int Id { get; set; }
        public string Name { get; set; }
        public Revenue Revenue { get; set; }
}

public class Revenue
{
        [Key]
        public int Id { get; set; }
        public double GrossIncome { get; set; }
}

Я пытаюсь использовать код EF6 в первую очередь для сохранения некоторых данных о фильмах в базе данных:

public class MovieContext: DbContext
{
    public MovieContext(): base("name=testDB") { }
    public DbSet<Movie> Movies { get; set; }
    public DbSet<Revenue> Revenues { get; set; }
}

Я начинаю свставка нового фильма со связанным доходом в БД:

using (var context = new MovieContext())
{
    Revenue revenue = new Revenue()
                {
                    GrossIncome = 10
                };
    Movie movie = new Movie()
                {
                    Name = "foo",
                    Revenue = revenue
                };

    context.Movies.Add(movie);
    context.SaveChanges();
}

В SQL Server видно, что таблицы созданы и столбец Movies.Revenue_Id создан с отношением внешнего ключа.на Revenue.Id.

Если я попытаюсь выполнить запрос с использованием SQL, он будет работать нормально:

SELECT Movies.Name, Revenues.GrossIncome
FROM Movies
LEFT JOIN Revenues ON Movies.Revenue_Id = Revenues.Id

вернет

Name    GrossIncome
----------------------
foo         10

Однако, если я попытаюсь использоватьEntity Framework для запроса данных:

using (var context = new MovieContext())
{
    List<Movie> movieList = context.Movies.ToList();
    Console.WriteLine("Movie Name: " + movieList[0].Name);

    if (movieList[0].Revenue == null)
    {
        Console.WriteLine("Revenue is null!");
    }
    else
    {
        Console.WriteLine(movieList[0].Revenue.GrossIncome);
    }

    Console.ReadLine();
}

Консоль читает:

Movie Name: foo     <- It shows that the query works, and that the data in the main table is fetched.
Revenue is null!    <- Even though the data in the DB is correct, EF does not read the data from the foreign key.

Мой вопрос прост: что я делаю не так?Как считывать значения внешнего ключа?

1 Ответ

0 голосов
/ 07 февраля 2019

Просто включает дочернюю сущность, которую вы хотите загрузить:

using (var context = new MovieContext())
{
    List<Movie> movieList = context.Movies
                                   .Include(m => m.Revenue)   // ADD THIS INCLUDE
                                   .ToList();
    Console.WriteLine("Movie Name: " + movieList[0].Name);

    if (movieList[0].Revenue == null)
    {
        Console.WriteLine("Revenue is null!");
    }
    else
    {
        Console.WriteLine(movieList[0].Revenue.GrossIncome);
    }

    Console.ReadLine();
}

Это загрузит фильмы - и также убедитесь, что все ссылки на их соответствующие ссылки .Revenue имеютбыл загружен тоже.

...