Entity Framework data-first: автоматическая загрузка связанных данных - PullRequest
0 голосов
/ 07 октября 2011

Я пытаюсь использовать Entity Framework с существующей базой данных.Используя подход, основанный на коде, я получил следующую автоматически созданную модель (среди прочего - я попытался сократить код, чтобы понять суть вопроса):

namespace Fidd.Models
{
    using System;
    using System.Collections.Generic;

    public partial class Movies
    {
        public Movies()
        {
            ...
            this.MoviesPictures = new HashSet<MoviesPictures>();
            ...
        }

        public int MovieID { get; set; }
        public string MovieName { get; set; }
        ...

        public virtual ICollection<MoviesPictures> MoviesPictures { get; set; }
    }
}

Так что в основном этоявляется отношением 1-n между Movies и MoviesPictures.Я все еще в процессе изучения EF.

Если я хочу загрузить один фильм с

var movie = from m in dbContext.Movies
            where m.MovieID == 5
            select m;

Как мне сделать так, чтобы коллекция MoviesPictures загружалась автоматически?Либо нетерпеливый, либо ленивый.

ОБНОВЛЕНИЕ: На самом деле существует дополнительная связь:

Фильмы 1..n MoviesPictures n..1 Pictures

Модель MoviesPictures определяется следующим образом:

public partial class MoviesPictures
{
    public int MoviePictureID { get; set; }
    public int MoviePictureMovieID { get; set; }
    public int MoviePicturePictureID { get; set; }
    public System.DateTime MoviePictureAddDatetime { get; set; }
    public bool MoviePictureRemoved { get; set; }
    public Nullable<System.DateTime> MoviePictureRemovedDatetime { get; set; }

    public virtual Movies Movies { get; set; }
    public virtual Pictures Pictures { get; set; }
}

Есть ли способ загрузить 2. этот уровень ассоциации в пределах одного и того же запроса?Я пытался сделать это:

var model = from m in db.Movies.Include("MoviesPictures").Include("Pictures")
            where m.MovieID == id
            select m

, который не работает - я получаю исключение времени выполнения, что Картинки не определены с атрибутом навигации в Фильмах.Что, конечно, имеет смысл.Я просто не знаю, как задать запрос иначе.

Еще одна вещь, которая меня беспокоит ... Вышеуказанный оператор Include () не перехватывает никаких ошибок во время компиляции.Есть ли способ указать это безопасным для типа способом?

/ Carsten

1 Ответ

2 голосов
/ 07 октября 2011

Вы хотели бы сделать:

var movie = from m in dbContext.Movies.Include("MoviesPictures")
            where m.MovieId == 5
            select m;

Это нетерпеливо выбирает записи из таблицы «MoviesPictures». Вы можете прочитать об этом немного больше здесь: http://msdn.microsoft.com/en-us/magazine/cc507640.aspx. Также, если вы включите Google в "Entity Framework", вы можете найти гораздо больше информации.

UPDATE

Вы можете сделать .Include("MoviesPictures.Pictures"), это зависит от того, как у вас настроены вещи. Если нет, то вы хотите сделать несколько соединений; здесь есть хороший пост в блоге: http://weblogs.asp.net/salimfayad/archive/2008/07/09/linq-to-entities-join-queries.aspx о присоединениях.

В отношении того, чтобы делать это в «безопасном виде»; это единственный метод «включения» связанных записей. Как я уже говорил, вы можете использовать соединение, которое может быть немного ближе к «типобезопасности».

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...