ASP.NET 2.2 Core Добавление пользователя к модели вызывает исключение нулевой ссылки - PullRequest
0 голосов
/ 13 июня 2019

У меня есть модель, которая имеет свойство Publisher типа ApplicationUser.Когда я пытаюсь создать модель, она выдает исключение нулевой ссылки.

В модели:

[Display(Name = "Publisher")]
[ForeignKey("PublisherId")]
public ApplicationUser Publisher { get; set; }

В ApplicationUser:

public ICollection<Model> PublishedModels { get; set; }

Многозначныйодно отношение в контексте БД:

b.HasMany(u => u.PublishedModels)
     .WithOne(v => v.Publisher)
     .IsRequired()
     .OnDelete(DeleteBehavior.Restrict);

В методе Create контроллера (получить текущего пользователя):

var user = await _userManager.GetUserAsync(HttpContext.User);

Я получаю нулевую ссылку на эту строку:

model.Publisher = user;

Я запутался, я подтвердил, что пользователь не является нулевым.Модель не нулевая, а ModelState действителен.Тогда почему я не могу присвоить это значение model.Publisher?Странно то, что если я не изменяю модель и просто сохраняю ее в БД, она работает.Но мне нужно добавить и издателя.Если я только устанавливаю дату, это тоже нормально.

Это работает, но при удалении комментариев он жалуется на нулевую ссылку при установке даты.

public async Task<IActionResult> Create([Bind(include:"...")] Model model)
{
    ApplicationUser user = await _userManager.GetUserAsync(HttpContext.User);
    try
    {
        if (ModelState.IsValid)
        {
            model.PublicationDate = DateTime.Now;

            //user.PublishedModels.Add(model);

            _context.Add(model);
            //_context.Update(model.Publisher);

            await _context.SaveChangesAsync();

            return RedirectToAction(nameof(Index));
        }
    }
    catch (DataException /*dex*/)
    {
        ModelState.AddModelError("", "...");
    }
    return View(model);
}

В следующей трассировке стека:происходит сбой в первой строке метода ...

NullReferenceException: Object reference not set to an instance of an object.
WebApp.Controllers.Admin.ModelController.Create(Model model) in 
ModelController.cs
-
[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Create([Bind(include:"...")] Model model)
{
    var user = await _userManager.GetUserAsync(HttpContext.User);
    user.PublishedModels.Add(model);
    model.PublicationDate = DateTime.Now;
    model.Publisher = user;
    try
    { 
Microsoft.AspNetCore.Mvc.Internal.ActionMethodExecutor+TaskOfIActionResultExecutor.Execute(IActionResultTypeMapper mapper, ObjectMethodExecutor executor, object controller, object[] arguments)

System.Threading.Tasks.ValueTask.get_Result () Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.InvokeActionMethodAsync () Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.InvokeNextActionFilterAsync (). Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.Rethrow (контекст ActionExecutedContext).Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.InvokeInnerFilterAsync ()nal.ResourceInvoker.Next (ref State next, ref Область действия, ref ref состояние isCompleted). Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.InvokeFilterPipelineAsync () Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.Invoke.AspNetCore.Routing.EndpointMiddleware.Invoke (HttpContext httpContext) Microsoft.AspNetCore.Routing.EndpointRoutingMiddleware.Invoke (HttpContext httpContext) Microsoft.AspNetCore.Authentication.Microsoft.AspNetCore.Session.SessionMiddleware.Invoke (контекст HttpContext) Microsoft.AspNetCore.Session.SessionMiddleware.Invoke (контекст HttpContext) Microsoft.AspNetCore.StaticFiles.StaticFileMiddleware.(Контекст HttpContext) Microsoft.AspNetCore.Diagnostics.EntityFrameworkCore.DatabaseErrorPageMiddleware.Invoke (HttpContext httpContext) Microsoft.AspNetCore.Diagnostics.EntityFrameworkCore.DatabaseErrorPageMiddleware.Invoke (HttpContext httpContext) Microsoft.AspNetCore.Diagnostics.DeveloperExceptionPageMiddleware.InConte

1 Ответ

1 голос
/ 14 июня 2019

Не удалось воспроизвести вашу проблему, проверьте разницу между вашим кодом и ниже:

  1. Вы определили PublishedModels в ApplicationUser, но вы указали PublishedModel.
  2. DbContext, для приведенного ниже кода, если вы не установили значение для Publisher или PublisherId при создании Model, вы получите ошибку, поскольку не установили значение дляPublisherId, но вы этого не сделали, проверьте, сохраняете ли вы модель и базу данных одинаковыми.

            builder.Entity<ApplicationUser>()
                    .HasMany(u => u.PublishedModels)
                    .WithOne(vv => vv.Publisher)
                    .IsRequired()
                    .OnDelete(DeleteBehavior.Restrict);
    
  3. Способ создания модели с применением пользователя

            public async Task<IActionResult> Create([Bind("Id,Name")] Model model)
            {
                    ApplicationUser user = await _userManager.GetUserAsync(HttpContext.User);
                    if (ModelState.IsValid)
                    {
                            model.Publisher = user;
                            _context.Add(model);
                            await _context.SaveChangesAsync();
                            return RedirectToAction(nameof(Index));
                    }
                    return View(model);
            }
    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...