Entity Framework 6 Include () на самом деле не включает свойство навигации

1

У меня есть простая, но в то же время неприятная проблема. Я пытаюсь создать общие методы для операций CRUD в Business Layer. Существует определенное требование, чтобы все свойства навигации были включены для некоторых объектов и должны быть возвращены в виде списка.

Посмотрите на оба примера кода:

List<Event> list;
using (var db = new DbContext())
{
    db.Configuration.ProxyCreationEnabled = false;
    var dbQuery = db.Set<Event>();
    list = dbQuery.Include(x => x.Location).ToList();
}

Над фрагментом кода работает нормально, как ожидалось.

List<Event> list;
using (var db = new DbContext())
{
    db.Configuration.ProxyCreationEnabled = false;
    var dbQuery = db.Set<Event>();
    // foreach(var np in navigationProperties) -> I omitted this block and only included one property to keep it simple
    dbQuery.Include(x => x.Location);
    list = dbQuery.ToList();
}

Над фрагментом кода не работает (отлично работает в EF4). Причина, по которой мне нужен второй блок, заключается в том, что свойства навигации, которые всегда должны быть включены, сохраняются в отдельном файле манифеста, а через цикл foreach они включаются в зависимости от типа объекта.

Кажется, что оба они очень такие же, но на самом деле нет. Я не мог найти решение и нуждаюсь в вашей помощи.

Заранее благодарю за любые комментарии/отзывы.

ОБНОВЛЕНИЕ (с РЕШЕНИЕМ): Благодаря отзывам Masoud'd, проблема теперь ясна. если вы вызываете dbQuery.Include(...), то команда sql в dbQuery НЕ изменяется. Поэтому вам нужно присвоить результат другому запросу. Я предоставляю следующий код, который отлично подходит для других, у кого такая же проблема:

List<Event> list;
using (var db = new DbContext())
{
    db.Configuration.ProxyCreationEnabled = false;
    var dbQuery = db.Set<Event>();
    DbQuery<Event> query = null;
    foreach (var navigationProperty in navigationProperties)
    {
        if(query==null)
            query = dbQuery.Include(navigationProperty);
        else
            query = query.Include(navigationProperty);
    }
    if (query != null) list = query.ToList();
}
  • 0
    В чем разница между первым и вторым фрагментом?
  • 0
    Не работает? ... Я думаю, я пойду к своему боссу сегодня и скажу, что это не работает и посмотрю, делает ли это объяснение его счастливым: D
Показать ещё 3 комментария
Теги:
navigation
entity-framework
properties
include

2 ответа

1
Лучший ответ

Попробуйте следующий код:

{
  ...
  var query = dbQuery.Include(x=>x.Location);
  list = query.ToList();
  ...
}
  • 0
    Как я уже говорил, первый фрагмент кода уже работает, и вы предоставили тот же код. Мне нужно вызвать метод Include в цикле foreach, и поэтому мне нужно использовать второй фрагмент кода.
  • 0
    @ IbrahimÇ. Мой код не является вашим первым фрагментом кода, он сохраняет результат в переменной IQueryable и затем использует его, он также может использоваться в цикле.
Показать ещё 2 комментария
1

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

Если вы измените этот код

List<Event> list;
using (var db = new DbContext())
{
    db.Configuration.ProxyCreationEnabled = false;
    var dbQuery = db.Set<Event>();
    dbQuery.Include(x => x.Location);
    list = dbQuery.ToList();
}

в

List<Event> list;
using (var db = new DbContext())
{
    db.Configuration.ProxyCreationEnabled = false;
    var dbQuery = db.Set<Event>();
    dbQuery.Include(x => x.Location).Load();
    list = dbQuery.ToList();
}

то это работает.

Но я не уверен, что это оптимальный способ решения проблемы.

  • 0
    Используя метод List (), вызовите немедленную загрузку данных из базы данных и снизьте производительность: msdn.microsoft.com/en-us/data/jj592911.aspx
  • 0
    Вы имеете в виду метод Load ()?
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню