【问题标题】:How to SaveChanges in SQL Server?如何在 SQL Server 中保存更改?
【发布时间】:2020-08-10 18:23:52
【问题描述】:

我正在尝试为 ApplicationUser.cs 添加一个控制器,以便当管理员登录时,他们能够查看、编辑、删除 dbo.AspNetUsers 表中的任何记录,但是我认为我正在这样做它错了。运行时出现错误“NullReferenceException: Object reference not set to an instance of an object.”有什么想法吗?

管理员控制器:

public AdminController (ApplicationDbContext application)
{
    _application = application;

        [HttpGet]
        public IActionResult ActiveUser() { return View();}


        [HttpPost]
        public async Task<ActionResult> ActiveUser(ApplicationUser Model)
        {
            var active = await _application.Users.FindAsync(Model.Email);

            Model.IsActive = true;
            active.IsActive = (Model.IsActive==true);

         await _application.SaveChangesAsync(); 

            return View();
        }

查看:`@model ApplicationUser

            <input asp-for="IsActive" class="form-control" />
            <span asp-validation-for="IsActive" class="text-danger"></span>
        </div>
        <button type="submit" class="btn btn-success">ok</button>`

【问题讨论】:

    标签: sql-server asp.net-core entity-framework-core asp.net-core-mvc asp.net-core-identity


    【解决方案1】:

    您实际上从未在用户对象上设置 IsActive。请注意,“=”和“==”是有区别的。

    试试这个代码:

     ApplicationUser active = await _application.Users.FindAsync(Model.Email);
     active.IsActive = true;
     _application.Update(active);
     await _application.SaveChangesAsync();
    

    【讨论】:

    • 我按照你说的做了“ [HttpGet] public IActionResult ActiveUser() { return View();} [HttpPost] public async Task ActiveUser(ApplicationUser Model) { ApplicationUser active = await _application. Users.FindAsync(Model.Email); active.IsActive = Model.IsActive; _application.Update(active); await _application.SaveChangesAsync(); return View(); } "
    • 您是否真的在视图中将 IsActive 设置为 true ?
    • 没有。但是现在我改变它并且编译器不能接受“active.IsActive = (active.IsActive == true);”iv View
    • 我已经改变了我的答案。请尝试更新后的代码。
    • 我应该制作新表并将这些信息放在那里吗?如何在视图中设置 IsActive?
    【解决方案2】:

    错误消息表明您正在尝试从空引用访问属性。根据提供的代码,有两个可能的原因:

    1. “等待 _application.Users.FindAsync(Model.Email);”没有找到用户并返回 null,因此,当您尝试执行“active.IsActive = (Model.IsActive==true);”时你得到了例外。

    2. “模型”变量未获得实例,您将获得空引用异常。您需要验证您是否在“POST”中发送有效负载,并且还需要使用“[FromBody]”属性装饰“Model”参数。见下文:

    [HttpPost]
    public async Task<ActionResult> ActiveUser([FromBody]ApplicationUser Model)
    {
      // Always check the parameters....
      if (Model == null)
      {
         return View();
      }
    
      var active = await _application.Users.FindAsync(Model.Email);
    
      // Always verify if found...
      if (active == null)
      {
        Response.StatusCode=404;
        return View(); 
      }
    
      active.IsActive = (Model.IsActive==true);
    
      await _application.SaveChangesAsync(); 
    
      return View();
    }
    

    【讨论】:

    • 提交帖子时...您是否可以使用“ActiveUser”功能?...或...您在提交帖​​子时收到“ERROR 415”吗?...它似乎是与“Content-Type”标头丢失或类型错误有关的问题。此外,如果您在 URL 中发送数据,请尝试删除“[FromBody]”属性。
    【解决方案3】:

    你需要为Model.IsActive赋值:

    if (active.IsActive == false) 
    { 
        Model.IsActive = (active.IsActive == true); 
    }
    _application.Update(active);
    await _application.SaveChangesAsync(); 
    return View();
    

    【讨论】:

    • 仍然没有改变
    • 尝试查看其他字段是否更改,例如Model.FirstName = "Joseph";
    • No.no 变化发生
    • EntityFramework 好像没有生成UPDATE sql 代码。你能看到生成了什么 SQL 代码吗?
    • MyView应该是怎样的?可能是因为myView吧。
    【解决方案4】:

    您的代码似乎正确。但似乎您需要将model 对象传递给View。在您的情况下,您的 View 似乎需要传递对象 active

    尝试return View(active); 而不是return View()

    【讨论】:

      猜你喜欢
      • 2013-11-17
      • 1970-01-01
      • 2010-12-30
      • 1970-01-01
      • 2015-12-02
      • 1970-01-01
      • 2013-08-03
      • 2019-11-27
      • 2011-03-30
      相关资源
      最近更新 更多