DbContext был размещен с несколькими частичными представлениями - PullRequest
0 голосов
/ 21 февраля 2020

У меня есть представление, которое имеет 3 частичных представления, разделенных вкладками. Каждое частичное представление запрашивает базу данных и возвращает результаты в список, отображаемый в таблице. Уровень доступа к данным использует общий репозиторий c для доступа к данным.

Вот метод generi c, который получает все результаты для одной таблицы:

 public virtual IList<T> GetAll<T>(params Expression <Func<T, object>>[] navigationProperties) where T : class
        {

            try
            {
                using (Context)
                {
                    List<T> list;
                    IQueryable<T> dbQuery = Context.Set<T>();

                    foreach (Expression<Func<T, object>> navigationProperty in navigationProperties)
                        dbQuery = dbQuery.Include<T, object>(navigationProperty);

                        list = dbQuery.AsNoTracking().ToList();

                    return list;
                }
            }
            catch (ArgumentNullException ex)
            {
                throw new InvalidOperationException($"Invalid state: {typeof(T).Name} DbSet is null.", ex);
            }
        }

Вот ресурс, который я использовал для создания этого метода

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

 public async Task<ActionResult> DataTableAsync<TEntity>(AlertModel alert, string viewName = null, 
params Expression<Func<TEntity, object>>[] navigationProperties) where TEntity : class
        {

            // get data
            var data = (from a in await LimsManager.AllAsync<TEntity>(navigationProperties)
                        select a).ToList();

            // create sample log model 
            var response = new TableModel<TEntity>
            {
                Data = data
            };

            return PartialView(viewName ?? $"_{typeof(TEntity).Name}Table", response);

        }

Свойства навигации передаются с помощью лямбда-выражения s => s.'NavigationProperty'.

В этом представлении я вызываю метод GetAll() для каждого частичного представления. Первые два частичных представления возвращаются правильно, но третье частичное представление всегда дает мне контекст, в котором была устранена ошибка. Это происходит даже при звонке .ToList().

Насколько я понимаю, исследуя проблему, кажется, что контекст удаляется в конце второго вызова, поэтому в третий раз он вызывает , контекст уже исчез .

Итак, мой вопрос: как я могу предотвратить удаление контекста перед третьим вызовом?

1 Ответ

0 голосов
/ 21 февраля 2020

Каждый день узнаю что-то новое.

В моей библиотеке Entity Framework (DAL) у меня был конструктор контекста

 public Store(EntitiesContext context)
        {
            Context = context;
        }

В моем методе я использовал Context. Поэтому каждый раз, когда вызывался метод, он использовал контекст, созданный при создании экземпляра класса и его удалении. Чтобы это исправить, я просто поместил создание контекста прямо в оператор using. Поэтому вместо using(Context) я изменил на using (var db = new LimsEntitiesContext())

...