Faris Karcic Ответов: 1

Запрос данных от applicationuser


Во-первых, я до сих пор не понимаю некоторых основ отношений CodeFirst, так что это может быть проблемой.

Итак, у меня есть свойство "SIMCardNumber" (строка) в таблице ApplicationUser, из которого я хочу получить данные и показать их на экране, однако у меня возникли проблемы с этим. Я не уверен, почему на других таблицах, не связанных с ApplicationUsers, у меня не было таких проблем с кодом контроллера.

Проект представляет собой MVC 5 с кодовым подходом к моделям.

Я получаю
Object reference not set to an instance of an object.


Вот полный текст сообщения об ошибке:

Server Error in '/' Application.

Object reference not set to an instance of an object.

Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code. 

Exception Details: System.NullReferenceException: Object reference not set to an instance of an object.

Source Error: 


Line 262:
Line 263:            
Line 264:            var sim = context.DetailsUsers
Line 265:               .Where(a => a.UserId.Id == userId)
Line 266:               .Select(a => a.SIMCardNumber).FirstOrDefault();

Source File: C:\Users\Faris\Documents\Visual Studio 2017\Projects\SmartAgro\SmartAgro\Controllers\ManageController.cs    Line: 264 

Stack Trace: 


[NullReferenceException: Object reference not set to an instance of an object.]
   SmartAgro.Controllers.ManageController.UpdateSIM() in C:\Users\Faris\Documents\Visual Studio 2017\Projects\SmartAgro\SmartAgro\Controllers\ManageController.cs:264
   lambda_method(Closure , ControllerBase , Object[] ) +62
   System.Web.Mvc.ActionMethodDispatcher.Execute(ControllerBase controller, Object[] parameters) +14
   System.Web.Mvc.ReflectedActionDescriptor.Execute(ControllerContext controllerContext, IDictionary`2 parameters) +157
   System.Web.Mvc.ControllerActionInvoker.InvokeActionMethod(ControllerContext controllerContext, ActionDescriptor actionDescriptor, IDictionary`2 parameters) +27
   System.Web.Mvc.Async.AsyncControllerActionInvoker.<BeginInvokeSynchronousActionMethod>b__39(IAsyncResult asyncResult, ActionInvocation innerInvokeState) +22
   System.Web.Mvc.Async.WrappedAsyncResult`2.CallEndDelegate(IAsyncResult asyncResult) +29
   System.Web.Mvc.Async.WrappedAsyncResultBase`1.End() +49
   System.Web.Mvc.Async.AsyncControllerActionInvoker.EndInvokeActionMethod(IAsyncResult asyncResult) +32
   System.Web.Mvc.Async.AsyncInvocationWithFilters.<InvokeActionMethodFilterAsynchronouslyRecursive>b__3d() +50
   System.Web.Mvc.Async.<>c__DisplayClass46.<InvokeActionMethodFilterAsynchronouslyRecursive>b__3f() +225
   System.Web.Mvc.Async.<>c__DisplayClass33.<BeginInvokeActionMethodWithFilters>b__32(IAsyncResult asyncResult) +10
   System.Web.Mvc.Async.WrappedAsyncResult`1.CallEndDelegate(IAsyncResult asyncResult) +10
   System.Web.Mvc.Async.WrappedAsyncResultBase`1.End() +49
   System.Web.Mvc.Async.AsyncControllerActionInvoker.EndInvokeActionMethodWithFilters(IAsyncResult asyncResult) +34
   System.Web.Mvc.Async.<>c__DisplayClass2b.<BeginInvokeAction>b__1c() +26
   System.Web.Mvc.Async.<>c__DisplayClass21.<BeginInvokeAction>b__1e(IAsyncResult asyncResult) +100
   System.Web.Mvc.Async.WrappedAsyncResult`1.CallEndDelegate(IAsyncResult asyncResult) +10
   System.Web.Mvc.Async.WrappedAsyncResultBase`1.End() +49
   System.Web.Mvc.Async.AsyncControllerActionInvoker.EndInvokeAction(IAsyncResult asyncResult) +27
   System.Web.Mvc.Controller.<BeginExecuteCore>b__1d(IAsyncResult asyncResult, ExecuteCoreState innerState) +13
   System.Web.Mvc.Async.WrappedAsyncVoid`1.CallEndDelegate(IAsyncResult asyncResult) +29
   System.Web.Mvc.Async.WrappedAsyncResultBase`1.End() +49
   System.Web.Mvc.Controller.EndExecuteCore(IAsyncResult asyncResult) +36
   System.Web.Mvc.Controller.<BeginExecute>b__15(IAsyncResult asyncResult, Controller controller) +12
   System.Web.Mvc.Async.WrappedAsyncVoid`1.CallEndDelegate(IAsyncResult asyncResult) +22
   System.Web.Mvc.Async.WrappedAsyncResultBase`1.End() +49
   System.Web.Mvc.Controller.EndExecute(IAsyncResult asyncResult) +26
   System.Web.Mvc.Controller.System.Web.Mvc.Async.IAsyncController.EndExecute(IAsyncResult asyncResult) +10
   System.Web.Mvc.MvcHandler.<BeginProcessRequest>b__5(IAsyncResult asyncResult, ProcessRequestState innerState) +21
   System.Web.Mvc.Async.WrappedAsyncVoid`1.CallEndDelegate(IAsyncResult asyncResult) +29
   System.Web.Mvc.Async.WrappedAsyncResultBase`1.End() +49
   System.Web.Mvc.MvcHandler.EndProcessRequest(IAsyncResult asyncResult) +28
   System.Web.Mvc.MvcHandler.System.Web.IHttpAsyncHandler.EndProcessRequest(IAsyncResult result) +9
   System.Web.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +9765121
   System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +155

Version Information: Microsoft .NET Framework Version:4.0.30319; ASP.NET Version:4.6.1586.0


Что я уже пробовал:

public ActionResult UpdateSIM()
        {
            
            var userId = User.Identity.GetUserId();

            
            var sim = context.Users
               .Where(a => a.Id == userId)
               .Select(a => a.SIMCardNumber).FirstOrDefault();

            if (sim == null)
            {
                var simtext = "You don't have any number linked to this account!";
                var view = new DetailsUserViewModel()
                {
                    SIMCardNumber = simtext
                };
                return View(view);
            }

            var viewModel = new DetailsUserViewModel()
            {
                SIMCardNumber = sim
            };
            
            return View(viewModel);
        }

1 Ответов

Рейтинг:
12

Faris Karcic

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

var sim = context.Users
               .Where(a => a.Id == userId)
               .Select(a => a.SIMCardNumber).FirstOrDefault();


вы должны использовать

var sim = UserManager.Users
               .Where(a => a.Id == userId)
               .Select(a => a.SIMCardNumber).FirstOrDefault();