【问题标题】:Updating one-to-many independent association relationship disconnected scenario更新一对多独立关联关系断开场景
【发布时间】:2015-01-07 16:41:51
【问题描述】:

我正在使用 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;}
}

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

[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 根本不处理这个吗?

【问题讨论】:

    标签: c# asp.net-mvc-4 entity-framework-6 one-to-many


    【解决方案1】:

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

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

    2. 1234563 /p>

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

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

    那么在你的行动中:

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

    【讨论】:

      猜你喜欢
      • 2014-07-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-01-27
      相关资源
      最近更新 更多