2009-09-26 3 views
6

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

private ObjectQuery<T> ObjectQueryList() 
    { 
     var list = CamelTrapEntities.CreateQuery<T>(EntitySetName); 
     return list; 
    } 

public IQueryable<T> List() 
    { 
     return ObjectQueryList(); 
    } 

Metod List() возвращает IQueryable < T >, Becase IQueryable < T > легко насмехаться. У меня также есть метод расширения:

public static IQueryable<T> Include<T>(this IQueryable<T> obj, string path) 
    { 
     if (obj is ObjectQuery<T>) 
      (obj as ObjectQuery<T>).Include(path); 

     return obj; 
    } 

Этот метод используется вне хранилища, чтобы получить список сущностей с навигационными свойствами уже загружены, например: List.Include («CreatedBy»). Проблема в том, что она не работает. Все включения игнорируются. при изменении списка() метод для

public ObjectQuery<T> List() 
    { 
     return ObjectQueryList(); 
    } 

все работает отлично.

Как я могу реализовать шаблон репозитория, чтобы иметь возможность выполнять более сложные запросы?

ответ

6

отражатель дал мне ответ:

public ObjectQuery<T> Include(string path) 
{ 
    EntityUtil.CheckStringArgument(path, "path"); 
    return new ObjectQuery<T>(base.QueryState.Include<T>((ObjectQuery<T>) this, path)); 
} 

Include возвращает новый объект ObjectQuery и моя Включать функция вернула старый объект. Переход к

public static IQueryable<T> Include<T>(this IQueryable<T> obj, string path) 
{ 
    if (obj is ObjectQuery<T>) 
     return (obj as ObjectQuery<T>).Include(path); 

    return obj; 
} 

решить эту проблему. Несколько часов потеряно, и я ненавижу Entity Framework больше :)

Это заставило меня понять, что я должен создать другую функцию списка с параметром Include и не разрешать делать, включает в себя внешний репозиторий.

1

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

1

С EntityFramework 4,1, DbExtensions (System.Data.Entity.DbExtensions) решает эту проблему, и изначально добавляет и .Include([string path]) и .Include([property expression]) для любого IQueryable<T>.

Просто убедитесь, что проект с использованием вашего репозитория ссылается на EntityFramework и, как и с любыми методами расширения, укажите using System.Data.Entity; в вашем файле класса, чтобы получить доступ к этим расширениям.

Смежные вопросы