Загрузка ассоциаций в RIA Services + Entity Framework Code-First - PullRequest
0 голосов
/ 06 сентября 2011

Я только что перевел свое решение EF 4.0 для использования EF 4.1 Code-First. Все прошло гладко, и я смог получить данные из БД и показать их в своем проекте Silverlight с помощью WCF RIA Services 1.0SP2-RC за пару часов.

Единственная проблема возникает, когда я пытаюсь загрузить ссылки в моей службе домена. Я добавил атрибут [Включить] в свой справочный объект. Кроме того, я включил отложенную загрузку для моего DbContext. Но все же следующий метод ничего не возвращает (следующий работает на Ef 4.0, но не на 4.1):

public IEnumerable<Bar> GetBarsInFoo (int fooId, bool direction)
{
    var foo = this.DbContext.Foos.FirstOrDefault(f => f.FooId == fooId);
    var Bars = foo.Bars.Where(b => b.Direction == direction).ToList();
    return Bars;
}  

Итак, я должен проверить и посмотреть, не включена ли указанная коллекция, а затем загрузить ее:

public IEnumerable<Bar> GetBarsInFoo (int fooId, bool direction)
{
    var foo = this.DbContext.Foos.FirstOrDefault(f => f.FooId == fooId);

    // Additional code to load the relation.
    if (!this.context.Entry(foo).Collection(f => f.Bars).IsLoaded)
    {
        this.context.Entry(foo).Collection(f => f.bars).Load();   
    }

    var Bars = foo.Bars.Where(b => b.Direction == direction).ToList();
    return Bars;
}  

Приведенный выше код возвращает результаты правильно.

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

Вот мои определения сущностей:

public partial class Foo
{
    [Key]
    public int FooId {get; set;}

    [Include]
    [Association("Foo_Bar", "FooId", "FooId")]
    [Display(AutoGenerateField = false)]
    public virtual ICollection<Bar> Bars { get; set; }
}

public partial class Bar
{
    [Key]
    public int BarId {get; set;}

    [Display(AutoGenerateField = false)]
    public int FooId { get; set; }

    [Include]
    [Display(AutoGenerateField = false, Name = "In Foo", Order = 12)]
    [Association("Foo_Bar", "FooId", "FooId", IsForeignKey = true)]
    [ForeignKey("FooId")]
    public virtual Foo Foo { get; set; }
}  

Можно ли как-нибудь разрешить EF обрабатывать загрузку отношений без проверки?

1 Ответ

0 голосов
/ 24 сентября 2011

Предполагая, что вы можете жить без отложенной загрузки, явным способом включения дочерних объектов является использование метода расширения Include<T>(...).В вашем примере

public IEnumerable<Bar> GetBarsInFoo (int fooId, bool direction)
{
    var foo = this.DbContext.Foos
                            .Include(f => f.Bars)
                            .FirstOrDefault(f => f.FooId == fooId);

    var Bars = foo.Bars.Where(b => b.Direction == direction).ToList();
    return Bars;
}

Это самый простой способ загрузить все дочерние объекты.В качестве дополнительного бонуса вы получите их за одну поездку в базу данных, а не за две.

Более подробную информацию вы можете найти в блоге команды ADO.NET , хотя это было дляCTP5.

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