【发布时间】:2019-06-13 14:48:33
【问题描述】:
我有一个具有 ApplicationUser 类型的属性 Publisher 的模型。当我尝试创建模型时,它给了我一个空引用异常。
在模型中:
[Display(Name = "Publisher")]
[ForeignKey("PublisherId")]
public ApplicationUser Publisher { get; set; }
在应用程序用户中:
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;
我很困惑,我验证了用户不为空。 Model 不为 null 且 ModelState 有效。那为什么我不能将该值分配给model.Publisher?奇怪的是,如果我不修改模型并将其保存到数据库中,它就可以工作。但我也需要添加发布者。如果我只设置日期也可以。
这可行,但是在删除 cmets 时,它会在设置日期时抱怨空引用。
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.Next(ref State next, ref Scope scope, ref object state, ref bool isCompleted) Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.InvokeInnerFilterAsync() Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.InvokeNextResourceFilter() Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.Rethrow(ResourceExecutedContext 上下文) Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.Next(ref State next, ref Scope scope, ref object state, ref bool isCompleted) Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.InvokeFilterPipelineAsync() Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.InvokeAsync() Microsoft.AspNetCore.Routing.EndpointMiddleware.Invoke(HttpContext httpContext) Microsoft.AspNetCore.Routing.EndpointRoutingMiddleware.Invoke(HttpContext httpContext) Microsoft.AspNetCore.Authentication.AuthenticationMiddleware.Invoke(HttpContext 上下文) Microsoft.AspNetCore.Localization.RequestLocalizationMiddleware.Invoke(HttpContext 上下文) Microsoft.AspNetCore.Session.SessionMiddleware.Invoke(HttpContext 上下文) Microsoft.AspNetCore.Session.SessionMiddleware.Invoke(HttpContext 上下文) Microsoft.AspNetCore.StaticFiles.StaticFileMiddleware.Invoke(HttpContext 上下文) Microsoft.AspNetCore.Diagnostics.EntityFrameworkCore.MigrationsEndPointMiddleware.Invoke(HttpContext 上下文) Microsoft.AspNetCore.Diagnostics.EntityFrameworkCore.DatabaseErrorPageMiddleware.Invoke(HttpContext httpContext) Microsoft.AspNetCore.Diagnostics.EntityFrameworkCore.DatabaseErrorPageMiddleware.Invoke(HttpContext httpContext) Microsoft.AspNetCore.Diagnostics.DeveloperExceptionPageMiddleware.Invoke(HttpContext context)
【问题讨论】:
-
唯一可能在该行引发此异常的是
model是否为空。model为空,异常是从不同的地方抛出的,或者你有一些奇怪的事情发生,比如抛出异常的自定义 getter/setter。发布您的堆栈跟踪。 -
没有自定义 getter。就像我必须以该方法将模型保存到数据库一样,似乎不接受我修改发布的模型。也许它与防伪有关?
-
这似乎不是完整的堆栈跟踪。看起来你已经修改了它。特别是它没有调用任何特定的行。
-
我修改了模型的名称。问题是没有空引用。当我添加代码以获取用户时,它会正确获取它,我可以看到该值。然后下一行失败,不管它是哪一行。如果我删除与用户相关的代码,它就可以工作。我使用经过身份验证的用户执行此操作。
标签: c# asp.net entity-framework asp.net-core