【问题标题】:How to keep original values of an entity while reloading related entities using Entity Framework Core when ModelState is not valid?当 ModelState 无效时,如何在使用 Entity Framework Core 重新加载相关实体时保留实体的原始值?
【发布时间】:2019-06-24 12:11:13
【问题描述】:

使用 ASP.NET Core 和 Entity Framework Core。

编辑记录时,我还会加载相关的“子”实体,用于在编辑表单中显示。

如果用户提交的表单缺少必填字段,则ModelState.IsValid 为假。 到目前为止一切顺利。

当将未更新的值返回给用户(带有错误消息)时,如何保留用户发布的原始值并重新加载相关实体?

在以下简化示例中,dbcontext 查询客户端记录并包含关联的状态表以显示状态名称。

如果ModelState 无效,则客户端记录会连同用户提交的值一起返回给用户——但此时所有相关的.Include 实体都为空。如何在不覆盖提交的视图模型的情况下重新填充 .Include 实体?

// GET
public async Task<IActionResult> Edit(int clientId)
{
    var client = _context.Client
                         .Include(x => x.State)
                         .Where(w => w.client_id == clientId
                         .FirstOrDefault();
    return View(client);
}

// POST
[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Edit(clientModel)
{
   //verify: last_name
   if (clientModel.last_name == null)
   {
       ModelState.AddModelError(string.Empty, "Last name is required");
   }

   if (ModelState.IsValid)
   {
      // Update the record and redirect
      await _context.SaveChangesAsync();
      return RedirectToAction(nameof(Index), new { client_id = clientModel.client_id });
   }

   // model state is not valid! Return record submitted to the edit view
   // *** MISSING THE VALUES FROM THE RELATED ENTITY clientModel.State at this point
   return View(clientModel);
}

【问题讨论】:

    标签: c# asp.net-core entity-framework-core


    【解决方案1】:

    首先State 导航属性应该是virtual 然后你可以使用await _context.Entry(clientModel).Reference(x =&gt; x.State).LoadAsync(); 加载它

    如果相关是一个集合,那么你可以使用await _context.Entry(clientModel).Collection(x =&gt; x.Collection).LoadAsync();

    另一种方法是从上下文中获取数据并分配它

    var client = _context.Client
                             .Include(x => x.State)
                             .Where(w => w.client_id == clientId
                             .FirstOrDefault(); 
    
    
     //or just get the state .. var state = _context.State..
    clientModel.State = client.State;
    return View(clientModel);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-29
      • 2018-02-27
      • 1970-01-01
      • 2016-10-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多