我的代码第一个模型具有一对多的关系。使用EF6迁移成功生成数据库。我创建了一个下拉列表但无法使用用户的选择更新数据库。
LiquidFormulas表包含一个外键GravureCylinderID(可为空),它指向表GravureCylinders中的ID字段。这是我的两个模型类:
public partial class LiquidFormula
{
public int ID { get; set; }
...
public int? GravureCylinderID { get; set; }
[ForeignKey("GravureCylinderID")]
public virtual GravureCylinders GravureCylinder { get; set;}
}
public class GravureCylinders
{
public int ID { get; set; }
...
public ICollection<LiquidFormula> LiquidFormulas { get; set; }
}
我的LiquidFormulaViewModel引用了LiquidFormula模型并保存了一个GravureCylinders的查找列表:
public class LiquidFormulaViewModel
{
public LiquidFormulaViewModel()
{
LiquidFormula = new LiquidFormula();
}
public LiquidFormula LiquidFormula { get; set; }
...
public IEnumerable<SelectListItem> GravureCylinderList { get; set; }
在Formulas控制器中,我填充了查找列表:
public ActionResult Edit(int? id)
{
LiquidFormula liquidFormula = _context.FormulasDbSet.Find(id);
...
var formulaVM = new LiquidFormulaViewModel();
formulaVM.LiquidFormula = liquidFormula;
formulaVM.GravureCylinderList = GetListOfGravureCylinderValues();
然后在视图中我显示查找列表并将其绑定到外键:
<select asp-for="LiquidFormula.GravureCylinderID" asp-items="@Model.GravureCylinderList" class="form-control">
<option>Select Volume in BCM</option>
</select>
我还在视图中添加了这个隐藏字段:
<input asp-for="@Model.LiquidFormula.GravureCylinder.ID" type="hidden" />
当发布视图表单时,我很难使用_context.SaveChanges();
来正确保存数据在SaveChanges之前我在ViewModel中看到了新的LiquidFormula.GravureCylinderID但是在SaveChanges之后数据库没有更新新ID。
编辑:我通过从视图中删除此隐藏字段来修复参照完整性约束错误(下面):
<input asp-for="@Model.LiquidFormula.GravureCylinder.ID" type="hidden" />
但数据库仍未使用新的LiquidFormula.GravureCylinderID进行更新。
在_context.SaveChanges();
之前,我在这一行上得到了一个参考约束错误,这是我正在做的其他工作所需要的:
_context.FormulasDbSet.Attach(modifiedFormulaVM.LiquidFormula);
以下是错误消息:
发生了参照完整性约束违规: &#39; GravureCylinders.ID&#39;的属性值。 在一段关系的一端与财产的价值不匹配 &#39; LiquidFormula.GravureCylinderID&#39;在另一端。
通过检查这两个ID,我看到LiquidFormula.GravureCylinderID
已更新,而GravureCylinders.ID尚未更新。如何正确更新这两个ID,尤其是GravureCylinders.ID?