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。父表已正确编辑。
非常感谢任何帮助。
答案 0 :(得分:1)
在Class 1中还添加应与主键属性匹配的foreignkey 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();
答案 1 :(得分:0)
我一直在努力解决这个问题。
当我进行编辑并保存时,我点击了公共异步任务编辑功能(Guid id,[Bind(“Class1ID,Class2,class1string”)] Class1 class1)(正如您所期望的那样) ) -
所有值都正确,除了 class1.Class2.Class2ID ,这是一个空guid {00000000-0000-0000-0000-000000000000}
因此,当调用 SaveChangesAsync 时,EF会为 Class2 创建新记录,而不是按预期更新现有记录。
这是因为绑定失败,无法找到 Class2.Class2ID 的值。
这是因为获取无法加载此值,因为它几乎肯定不在页面上。
将以下行添加到视图标记中(建议输入类型=“隐藏”asp-for =“Class1ID”旁边)
<input type="hidden" asp-for="Class2.Class2ID" />
这应该使绑定起作用。
我希望这会有所帮助。