2012-09-21 22 views
0

頒發者具有相關字段KeyEntity。我的代碼有效,但我認爲除了從數據庫加載實體之外,必須有更好的方法來更新相關的字段。 ViewModeling和模板應該有問題...在此先感謝。更新相關字段以獲得1對多關係的正確方法

OpViewModel

public class OpViewModel 
{ 
    public Connect.Models.Issuer Issuer { get; set; } 
    public IEnumerable<SelectListItem> KeyEntities { get; set; } 

    public OpViewModel() { } 
    public OpViewModel(Connect.Models.Issuer issuer, 
         IEnumerable<Jose.Models.KeyEntity> key_entities) 
    { 
     this.Issuer = issuer; 
     this.KeyEntities = key_entities.Select(k => 
         new SelectListItem() 
         { 
          Selected = (k.Id == issuer.KeyEntity.Id), 
          Text = k.Id.ToString(), 
          Value = k.Id.ToString() 
         }); 
    } 
} 

OP/Edit.chtml(剃刀)

@model AdConnect.Models.OpViewModel 
@using (Html.BeginForm()) { 

    <div class="editor-field"> 
     @Html.DropDownListFor(model => model.Issuer.KeyEntity.Id, 
           Model.KeyEntities) 
    </div> 

} 

OpController

[HttpPost] 
    public ActionResult Edit(Models.OpViewModel obj) 
    { 
     if (ModelState.IsValid) 
     { 
      // This works for most data fields of Issuer, but KeyEntity's Id 
      // (dbo.Issuers.KeyEntity_Id) is not updated. 
      // 
      // ctx.Entry(obj.Issuer).State = System.Data.EntityState.Modified 

      // So load Issuer and KeyEntity from the database and update. 

      var issuer = ctx.Issuers.Find(obj.Issuer.Id); 
      if (obj.Issuer.KeyEntity != null) 
      { 
       issuer.KeyEntity = 
        ctx.KeyEntities.Find(obj.Issuer.KeyEntity.Id); 
      } 
      ctx.Entry(issuer).CurrentValues.SetValues(obj.Issuer); 

      ctx.SaveChanges(); 
      return RedirectToAction("Index"); 
     } 

     return View(obj); 
    } 

回答

0

我認爲你缺少周圍的導航性能是如何工作的一個位。 EF可以自動填充它們,因此您不在對象的構造函數中執行它。

閱讀我關於導航屬性的文章here

另外就控制器更新代碼而言,像這樣的更新的正常路徑是:加載,修改,保存。

var issuer = ctx.Issuers.Include(i=>i.KeyEntity).SingleOrDefault(i=>i.Id == obj.Issuer.Id); 
issuer.Whatever = obj.Issuer.Whatever; //note prehaps you want something like CopyMatchinProperties here 
ctx.SaveChanges(); 
+0

謝謝盧克非常多。你的文章對我這樣的新手來說相當不錯。但我想,必須有更好的方法來提供ViewModel和更好的模板語法供選擇。除KeyEntity以外的其他字段在一行'ctx.Entry(obj.Issuer).State = System.Data.EntityState.Modified'中更新,但不適用於KeyEntity。這是一個問題。 –

+0

嗨Hideki,我通常完全分離我的數據和查看模型,這意味着我實際上並沒有從我的觀點中獲得數據模型。這是相當普遍的做法,因爲它是一種抽象應用程序的兩種截然不同的方法。我會建議進一步閱讀關於這種方法以及爲什麼它很重要。 http://www.howmvcworks.net/OnModelsAndViewModels/ToModelOrViewModel,http://stackoverflow.com/questions/5264009/asp-net-mvc-how-to-separate-view-models-from-db-models –

+0

但是如果您確實希望始終將數據模型發送到您的視圖中我認爲您還需要在模型接觸的所有其他實體上設置修改後的狀態。 (例如您所描述的示例中的KeyEntity)。 –