更新一对多独立关联关系断开连接方案

本文关键字:断开 连接 方案 关系 关联 一对多 独立 更新 | 更新日期: 2023-09-27 18:36:33

我正在使用EF 6,MVC 4(或5),并尝试更新我的两个实体之间的关系,这些实体具有独立的关联

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;}
}

在我的保存/编辑操作方法中,我似乎无法更新关系

[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 时,我要么遇到并发问题,要么活动组根本不更新。我知道我可以在课堂上添加一个 FK,但真的宁愿不这样做。 肯定有办法让它工作吗?EF 根本不处理这个问题吗?

更新一对多独立关联关系断开连接方案

最好的方法是添加外键属性,不管你是否真的愿意。这里的问题是您正在发布整个相关模型,或者更准确地说,您没有发布整个相关模型,因为发布的唯一属性是它的 id。这导致了两种同样令人讨厌的可能性:

  1. 如果未手动向实体框架指示您修改相关项,它将尝试添加它。但是,由于发布的 ID 已属于数据库中的现有项目,因此将引发异常。

  2. 如果您确实指示这是一个更新,那么除了 id 之外的所有属性都将更新为 null,因为没有在类上设置任何属性,这基本上会使您的数据变得无聊。

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

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

然后在您的操作中:

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