【问题标题】:One-To-Many Relationship not editing Child table一对多关系不编辑子表
【发布时间】:2016-08-26 21:53:35
【问题描述】:
public class Class1
{
    public Guid Class1ID { get; set; }
    public string class1string { get; set; }
    public virtual Class2 Class2 { get; set; }
}

public class Class2
{
    public Guid Class2ID { get; set; }
    public string class2string { get; set; }
}

// POST: Class1/Edit/5
    // To protect from overposting attacks, please enable the specific properties you want to bind to, for 
    // more details see http://go.microsoft.com/fwlink/?LinkId=317598.
    [HttpPost]
    [ValidateAntiForgeryToken]
    public async Task<IActionResult> Edit(Guid id, [Bind("Class1ID,Class2,class1string")] Class1 class1)
    {
        if (id != class1.Class1ID)
        {
            return NotFound();
        }

        if (ModelState.IsValid)
        {
            try
            {
                _context.Update(class1);
                await _context.SaveChangesAsync();
            }
            catch (DbUpdateConcurrencyException)
            {
                if (!Class1Exists(class1.Class1ID))
                {
                    return NotFound();
                }
                else
                {
                    throw;
                }
            }
            return RedirectToAction("Index");
        }
        return View(class1);
    }

编辑不是更改子表中的数据,而是在表中创建一个新行并更改父表中的 GUID。父表已正确编辑。

任何帮助将不胜感激。

【问题讨论】:

  • 这是因为 Class2 对象的 EntityState 可能处于已添加状态。在调用 _context.Update 方法之前尝试执行 _context.Entry(class1.Class2).State = EntityState.Modified。我假设 class1.Class2 有正确的 guid 集

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


【解决方案1】:

在您的 Class 1 中还添加应该与主键属性匹配的外键 id。 EF会知道其相关的

public class Class1
{
    public Guid Class1ID { get; set; }
    public string class1string { get; set; }
    public Guid? Class2ID { get; set; }
    [ForeignKey("Class2ID ")]//probably not needed as names match
    public virtual Class2 Class2 { get; set; }
}

public class Class2
{
    public Guid Class2ID { get; set; }
    public string class2string { get; set; }
}

这样在您的更新class1 中,您只需要检查您是否传递了正确的Class2ID 属性,而不必担心导航对象属性Class2

为了保存,您需要指定它已修改

 public async Task<IActionResult> Edit(Class1 class1)
 {
     ...
     _context.Entry(class1).State = EntityState.Modified;
     await _context.SaveChangesAsync();

【讨论】:

    【解决方案2】:

    我也一直在努力解决这个问题。

    当我进行编辑并保存它时,我点击了函数 public async Task Edit(Guid id,[Bind("Class1ID,Class2,class1string")] Class1 class1) (如您所料) -

    所有值都是正确的,除了 class1.Class2.Class2ID 是一个空的 guid {00000000-0000-0000-0000-000000000000}

    因此,当调用 SaveChangesAsync 时,EF 会为 Class2 创建一条新记录,而不是按预期更新现有记录。

    这是因为绑定失败,找不到Class2.Class2ID的值。

    这是因为 Get 无法加载此值,因为它几乎肯定不在页面上。

    将以下行添加到您的视图标记中(建议在 input type="hidden" asp-for="Class1ID" 旁边)

     <input type="hidden" asp-for="Class2.Class2ID" />
    

    这应该使绑定能够工作。

    我希望这会有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-12
      • 1970-01-01
      • 2019-09-15
      • 1970-01-01
      • 1970-01-01
      • 2013-06-17
      相关资源
      最近更新 更多