В чем проблема с использованием директивы и SQLite в следующей ситуации? Я получил ObjectDisposedException, но только здесь? - PullRequest
1 голос
/ 30 октября 2019

У меня нет проблем, например, здесь:

using FooContext context = new FooContext();
context.RemoveRange(context.FooTable);
context.SaveChanges();

Но я действительно получаю здесь ObjectDisposedException, когда я использую 'using директиву' либо с блоком (с {}, как до C # 8.0), либо с помощьюнаписание новой формы без {}.

DbSet<FooThing> allResults;
using (FooContext context = new FooContext()) 
{
   allResults = context.FooTable;               
}
return allResults;

И снова, никаких проблем со следующим:

FooContext context = new FooContext();
return context.FooTable;

В чем проблема с моим кодом и как я могу использовать директиву usingбез исключений?

РЕДАКТИРОВАТЬ:

Теперь я пытаюсь использовать DI. Я создал элемент скаффолдинга, выбрав «... используя Entity Framwork» в меню в VS.

В классе, который был создан VS, у меня есть экземпляр класса DbContext вверху:

        private readonly FooContext _context;

        public FooController(FooContext context)
        {
            _context = context;
        }

Я могу использовать этот объект, кажется, нет проблем с ним.

Но теперь я получаю:

System.InvalidOperationException: Unable to resolve service for type '<Namespaces of my app here>.FooContext' while attempting to activate '<Namespaces of my app here>.FooController'.

Я думаю,это потому, что я не вводил тип в соответствующий контейнер. Где мне это сделать?

Стоит ли здесь что-то делать?

      public void ConfigureServices(IServiceCollection services)
        {
            services.AddControllers();
        }

Ответы [ 3 ]

2 голосов
/ 30 октября 2019

A DbSet<T>, то есть экземпляр FooTable, является средством доступа к таблице. Вы возвращаете этот экземпляр (который затем используется чем-то, что мы предполагаем), но связанный экземпляр DbContext, на который опирается этот экземпляр, был удален вашим блоком using.

Если вы используете asp.net, вам следует использовать платформу Dependency Injection (например, AutoFac). Затем вы можете зарегистрировать свой тип DbContext, добавить его в свой контроллер, и AutoFac удалит экземпляр DbContext в конце запроса.

0 голосов
/ 30 октября 2019

Пока что кажется, что это решает мою текущую проблему:

EF Core, как получить DBContext в экземпляре класса?

Спасибо, Игорь, за упоминаниеDI!

Наконец-то я нашел это:

https://docs.microsoft.com/en-us/aspnet/core/fundamentals/dependency-injection?view=aspnetcore-3.0

0 голосов
/ 30 октября 2019

Ваш контекст удаляется при выходе из оператора using. Обычно с вашей allResults проблем не будет, но я думаю, вы пытаетесь использовать свойство навигации или связанный элемент в результатах. Ваш код будет пытаться получить данные, но затем он будет заблокирован, поскольку context, который использовался для получения данных, был удален.

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