Этот вопрос задавался много раз.Я думаю, что решил свою проблему, но, поскольку я новичок и все еще учусь, мне нужно ваше заверение.
Я создал метод 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 "строка