更新一对多独立关联关系断开场景
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。这导致两种同样令人讨厌的可能性:
如果您没有手动向 Entity Framework 指示您 修改 相关项目,它将尝试添加它。但是,由于 posted id 已经属于数据库中的现有项目,因此将引发异常。
如果你做表明这是一个更新,那么除了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;
}
我正在使用 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。这导致两种同样令人讨厌的可能性:
如果您没有手动向 Entity Framework 指示您 修改 相关项目,它将尝试添加它。但是,由于 posted id 已经属于数据库中的现有项目,因此将引发异常。
如果你做表明这是一个更新,那么除了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;
}