【问题标题】:How do I prevent a temporary value being assigned when editing a record with EntityFramework?使用 EntityFramework 编辑记录时,如何防止分配临时值?
【发布时间】:2019-05-23 07:09:01
【问题描述】:

我为记录创建了一个编辑页面,保存时出现以下错误:

实体类型“LoadTable”的属性“Id”在尝试将实体的状态更改为“已修改”时具有临时值。要么显式设置一个永久值,要么确保数据库配置为为此属性生成值。

我认为它可能被分配了一个临时值,而不是使用现有的值。

来自我的 Edit.cs:

[BindProperty]
public LoadTable LoadTable { get; set; }

public async Task<IActionResult> OnGetAsync(Guid id)
{
       if (id == null)
       {
            return NotFound();
       }
       LoadTable = await _context.LoadTable.FirstOrDefaultAsync(m => m.Id == id);

       if (LoadTable == null)
       {
            return NotFound();
       }
       return Page();
}

public async Task<IActionResult> OnPostAsync()
{
       if (!ModelState.IsValid)
       {
            return Page();
       }

       _context.Attach(LoadTable).State = EntityState.Modified;

       try
       {
            await _context.SaveChangesAsync();
       }
       catch (DbUpdateConcurrencyException)
       {
            if (!LoadTableExists(LoadTable.Id))
            {
                 return NotFound();
            }
            else
            {
                throw;
            }
        }
    return RedirectToPage("./Index");
}

private bool LoadTableExists(Guid id)
{
    return _context.LoadTable.Any(e => e.Id == id);
}

从上下文:


entity.Property(e => e.Id).HasDefaultValueSql("(newid())");

来自模型:

public partial class LoadTable
{
    public Guid Id { get; set; }
}

【问题讨论】:

    标签: c# asp.net entity-framework


    【解决方案1】:

    我怀疑发生的是 Id 属性在表单上没有对应的字段。

    我并不完全了解 Razor 页面的工作方式(您正在使用的就是这个,对吗?)

    但是,我怀疑当GETting 页面时,会设置 LoadTable 属性,并在视图中使用其属性,以便使用当前值填写表单。
    然后,当提交表单时,框架会创建LoadTable 类的新实例,然后它从请求中获取值并在LoadTable 的(新)实例中设置相应的属性。
    但是由于表单上没有 ID 字段,它不能设置 ID 属性,这就是为什么它只有默认值。

    如果我的猜测是正确的,那么解决方案是在表单中添加一个新字段(如果需要,可以将其隐藏)并将值设置为 LoadTable 的 ID。

    【讨论】:

      猜你喜欢
      • 2021-10-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多