更新一对多独立关联关系断开场景

Updating one-to-many independent association relationship disconnected scenario

我正在使用 EF 6、MVC 4(或 5)并尝试更新我的 2 个实体之间的关系,这些实体因此设置了独立关联

public class Activity{
public int ID {get;set;}
public string Description{get;set;}
public ActivityGroup ActivityGroup{get;set;}
}

public class ActivityGroup{
public int ID{get;set;}
public string Description{get;set;}
public ICollection<Activity> Activities{get;set;}
}

在我的 save/edit 操作方法中,我似乎无法获取要更新的关系

[HttpGet]
public ActionResult Edit(int id = 0)
{
EditActivityVM model = new EditActivityVM();
model.Activity = db.Activities.Include(a => a.ActivityGroup).SingleOrDefault(a => a.ID == id);
if (model.Activity == null)
{
return HttpNotFound(string.Format("Activity with ID: {0} not found", id.ToString()));
}
model.ActivityGroups = db.ActivityGroups.ToList();

return View(model);
}


[HttpPost]
    public ActionResult Edit(EditActivityVM activity){
    if(ModelState.IsValid){
    db.Entry(model.Activity).State = EntityState.Modified;
    db.SaveChanges();
    return RedirectToAction("Index");
    }
}

public class EditActivityVM{
public ICollection<ActivityGroup> ActivityGroups{get;set;}
public Activity Activity{get;set;}
}

@model EditActivityVM
@Html.HiddenFor(m => m.Activity.ID)

    <div class="editor-label">
        @Html.LabelFor(model => model.Activity.ActivityGroup.ID)
    </div>
    <div class="editor-field">
        @Html.DropDownListFor(m => m.Activity.ActivityGroup.ID, Model.ActivityGroups.Select(ag => new SelectListItem { Text = ag.Description, Value = ag.ID.ToString() }), "Select Group", null)
        @Html.ValidationMessageFor(model => model.Activity.ActivityGroup.ID)
    </div>


    <div class="editor-label">
        @Html.LabelFor(model => model.Activity.Description)
    </div>
    <div class="editor-field">
        @Html.EditorFor(model => model.Activity.Description)
        @Html.ValidationMessageFor(model => model.Activity.Description)
    </div>

问题是,当调用 savechanges 时,我要么遇到并发问题,要么 ActivityGroup 根本不更新。 我知道我可以在课堂上添加 FK,但我真的不愿意。肯定有办法让它发挥作用吗? EF 根本不处理这个吗?

最好 方法是添加一个外键 属性,无论您是否真的愿意。这里的问题是你 post 整个相关模型,或者更正确地说 而不是 post 整个相关模型,因为只有 属性 被 posted 是它的 ID。这导致两种同样令人讨厌的可能性:

  1. 如果您没有手动向 Entity Framework 指示您 修改 相关项目,它将尝试添加它。但是,由于 posted id 已经属于数据库中的现有项目,因此将引发异常。

  2. 如果你表明这是一个更新,那么除了id之外的所有属性都会被更新为null,因为none是在 class 上设置,本质上是在浪费你的数据。

通过 post 只输入外键,您不会有任何问题。如果你真的坚持不添加外键 属性,那么你唯一的选择是在你的视图模型上有一个 属性 来保存外键 posted 值,然后用它来查看在您的 post 操作中从数据库中更新对象。换句话说:

@Html.DropDownListFor(m => m.ActivityGroupId, ...)

那么在你的行动中:

var activityGroup = db.ActivityGroups.Find(model.ActivityGroupId);
if (activityGroup != null)
{
    model.Activity.ActivityGroup = activityGroup;
}