2015-01-07 18 views
1

我使用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完全不處理這個問題嗎?

回答

1

最好方法是添加一個外鍵屬性,儘管你是否真的喜歡或不喜歡。這裏的問題是,你發佈整個相關模型,或者更正確地發佈而不是發佈整個相關模型,因爲唯一發布的屬性是它的id。這導致兩個同樣討厭的可能性:

  1. 如果不手動指示實體框架,你修改相關項目,它會嘗試添加它。但是,由於發佈的ID已經屬於數據庫中的現有項目,因此會引發異常。

  2. 如果表明它是一個更新,那麼所有比ID之外的屬性將被更新爲null,因爲沒有一個是對類設置,基本上borking您的數據。

通過只發布外鍵,你不會有任何問題。如果你真的堅持不添加一個外鍵屬性,那麼你唯一的選擇是在你的視圖模型上有一個屬性來保存外鍵公佈值,然後用它在你的發佈操作中查看數據庫中最新的對象。換句話說:

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

然後在動作:

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