«Экземпляр ObjectContext был удален и больше не может использоваться для операций, требующих подключения». - PullRequest
0 голосов
/ 23 ноября 2018

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

Я создал метод Extension для вошедшего в систему пользователя, но когда я использую его в моем контроллере, он выдает ошибку в заголовке.

System.ObjectDisposedException: 'Экземпляр ObjectContext имеетбыл удален и больше не может использоваться для операций, требующих подключения. '

Поэтому я искал и экспериментировал, и добавление этой строки кода в контроллер решило мою проблему.

db.Users.Attach(LoggedUser);

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

Примерно так.

public class MyDbContext : DbContext
{
  public MyDbContext()
   {
    this.Configuration.LazyLoadingEnabled = false;
   }
}

Вот мой метод расширения:

 public static ApplicationUser GetLoggedInUserInDB(this System.Security.Principal.IPrincipal _User)
    {
        using (var db = new ApplicationDbContext())
        {
            string userId = _User.Identity.GetUserId();
            var LoggedUser = db.Users.Find(userId);
            return LoggedUser;
        }
    }

Мой контроллер:

public class MainPageController : ApiController
{
    [Route("Personal_Project/Main_Page_Personal_Project/UserUnfo")]
    [ResponseType(typeof(string))]
    [Authorize]
    public IHttpActionResult GetUserInfo()
    {
        using (var db = new ApplicationDbContext())
        {
            var LoggedUser = User.GetLoggedInUserInDB();
            //db.Users.Attach(LoggedUser); // This is what I added to solve my problem.
            return Ok(new UserInfoModel
            {
                Name = LoggedUser.UserName,
                Reputation = LoggedUser.Reputation,
                UserLevel = LoggedUser.UserLevel
            });
        }
    }
}

Так хорошо ли здесь решение "Мой"?Просто добавив:

db.Users.Attach(LoggedUser);

Это законно или это не то, как мы решаем эту проблему.Буду признателен за любой совет

Добавлено по запросу:

StackTrace:

ex.StackTrace "на System.Data.Entity.Core.Objects.ObjectContext.get_Connection () \ r \ n
в System.Data.Entity.Core.Objects.ObjectQuery 1.GetResults(Nullable 1 forMergeOption) \ r \ n в System.Data.Entity.Core.Objects.ObjectQuery 1.Execute(MergeOption mergeOption)\r\n at System.Data.Entity.Core.Objects.DataClasses.EntityReference 1. Загрузка(MergeOption mergeOption) \ r \ n в System.Data.Entity.Core.Objects.DataClasses.RelatedEnd.DeferredLoad () \ r \ n в System.Data.Entity.Core.Objects.Internal.LazyLoadBehavior.LoadProperty [TItem] (TItem propertyValue, String RelationsName, String targetRoleName, Boolean mustBeNull, Object wrapperObject) \ r \ n в System.Data.Entity.Core.Objects.Internal.LazyLoadBehavior. <> C__DisplayClass7`2.b__2 (прокси-элемент TProxy),\ n в System.Data.Entity.DynamicProxies.ApplicationUser_3D8410FBA1701532D53558B4E07B366CC45F4901DA609FCE10D652D704EEDD3C.get_CarGame () \ r \ n в PersonalProject.Controllers.ct \ PersonalProject \ PersonalProject \ Controllers \ MainPageController.cs: строка 32 "строка

1 Ответ

0 голосов
/ 23 ноября 2018

Вы получаете исключение из-за этого: get_CarGame().

Код внутри исходного сообщения не соответствует вашему фактическому коду.

Где-то внутри актуально MainPageController.GetUserInfo вы пытаетесь прочитать ApplicationUser.CarGame.И да, это проблема отложенной загрузки.

GetLoggedInUserInDB возвращает экземпляр прокси-класса, производного от ApplicationUser, и удаляет исходный контекст.Когда GetUserInfo пытается получить значение свойства CarGame, прокси пытается прочитать его из базы данных, используя удаленный контекст.В результате создается исключение.

Если вам действительно нужно CarGame внутри UserInfoModel:

  • , либо отключите отложенную загрузку, как показано выше, и используйте готовую загрузку;
  • использовать проекцию (то есть Select), чтобы получить информацию о пользователе как UserInfoModel на месте.В этом случае метод GetLoggedInUserInDB вообще не нужен.

В любом случае, присоединение LoggedUser к другому контексту не является подходящим способом.

...