ASP.Net Entity Framework Репозиторий и Linq - PullRequest
3 голосов
/ 16 июня 2010

Мой сценарий:

Это веб-приложение ASP.NET 4.0, запрограммированное с помощью C #

Я реализую шаблон репозитория.Все мои репозитории имеют одинаковые ObjectContext, которые хранятся в httpContext.Items.Каждый репозиторий создает новый ObjectSet типа E. Вот некоторый код из моего репозитория:

public class Repository<E> : IRepository<E>, IDisposable
    where E : class
{
    private DataModelContainer _context = ContextHelper<DataModelContainer>.GetCurrentContext();
    private IObjectSet<E> _objectSet;
    private IObjectSet<E> objectSet
    {
        get
        {
            if (_objectSet == null)
            {
                _objectSet = this._context.CreateObjectSet<E>();
            }
            return _objectSet;
        }
    }

    public IQueryable<E> GetQuery()
    {
        return objectSet;
    }

Допустим, у меня есть 2 репозитория, 1 для состояний и 1 для стран, и я хочу создать запрос linq дляи то и другое.Обратите внимание, что я использую классы POCO с каркасом сущностей.Штат и Страна являются двумя из этих классов POCO.

Repository stateRepo = new Repository<State>();
Repository countryRepo = new Repository<Country>();

IEnumerable<State> states = (from s in _stateRepo.GetQuery()
                             join c in _countryRepo.GetQuery() on s.countryID equals c.countryID
                             select s).ToList();
Debug.WriteLine(states.First().Country.country)

По сути, я хочу получить информацию о штате и связанной стране.Запрос только возвращает данные о состоянии ... и я получаю исключение с нулевым аргументом для Debug.WriteLine

LazyLoading отключен в моем .edmx ... вот так, как я этого хочу.

Ответы [ 2 ]

2 голосов
/ 16 июня 2010

Вы делаете соединение, не извлекая из него ничего. Есть несколько решений вашей проблемы:

  • Используйте Include для загрузки зависимых объектов: from s in ((ObjectSet<State>) _stateRepo.GetQuery).Include("Country"). Проблема с этим подходом состоит в том, что вы должны выставлять ObjectSet напрямую, а не IQueryable, если хотите избежать приведения.
  • Используйте context.LoadProperty(states.First(), s => s.Country), чтобы явно загрузить страну из базы данных для данного состояния.
  • Выберите оба объекта в запросе: from s in ... join c ... select new { s, c }. Вы не сможете напрямую получить доступ к свойству Country состояния, но оно будет иметь анонимный тип.
  • Включить отложенную загрузку.
1 голос
/ 16 июня 2010

Ваша реализация репозитория очень похожа на мою, особенно то, как вы храните ObjectContext.Это прекрасно работает для меня, поэтому я не думаю, что это концептуальная проблема.

Попробуйте использовать статический объектный контекст (без оболочки), чтобы посмотреть, решит ли это проблему.Возможно, в вашем ContextHelper есть ошибка, из-за которой ваш контекст удаляется и воссоздается.

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