无法配置和更新简单的一对多关系

时间:2017-11-13 20:30:50

标签: asp.net-mvc entity-framework entity-framework-6 asp.net-core-mvc one-to-many

我的代码第一个模型具有一对多的关系。使用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?

0 个答案:

没有答案