2011-01-23 55 views
2

在搜索Stack Overflow和Google時,我很難找到明確的答案,希望有人能指點我正確的方向。MVC和EF4 CTP模型綁定和保存分層模型

我的情況 我希望能夠使用單個編輯表單(在一個單一的視圖)使用ASP.NET MVC 3和Entity Framework 4 CTP更新3級深層次的實體(代碼 - 第一個) - 該模型由服務組成,該服務可以有許多服務選項,在Turn中可​​以有許多庫存項目。

我期待能夠使用MVCS默認的模型粘合劑(通過TryUpdateModel)到:

  1. 更新現有的「服務」記錄
  2. 添加/更新/刪除「服務選項」記錄(附到服務),這取決於張貼值
  3. 添加/更新/刪除「廣告資源」記錄(附加到每個服務選項),這取決於張貼值

中號Y型

[Bind(Include="Name, ServiceOptions")] 
public class Service { 
    [Key] 
    public int ServiceID { get; set; }  
    public string Name { get; set; }   
    public DateTime DateCreated { get; set; } 
    public virtual ICollection<ServiceOption> ServiceOptions { get; set; } 
} 

[Bind(Include="ServiceOptionID, Description, Tags")] 
public class ServiceOption { 
    [Key] 
    public int ServiceOptionID { get; set; } 
    public int ServiceID { get; set; } /* parent id reference */ 
    public string Description { get; set; } 
    public virtual ICollection<Inventory> InventoryItems { get; set; } 
} 


[Bind(Include = "InventoryID, Description")] 
public class Inventory { 
    [Key] 
    public int InventoryID { get; set; } 
    public int ServiceOptionID { get; set; } /* parent id reference */ 
    public string Description { get; set; } 
} 

理想控制器的方法:

[HttpPost] 
public ActionResult EditService(int id) { 
    Service service = db.Services.Single(s => s.ServiceID == id); 
    TryUpdateModel(service); // automatically updates child and grandchild records 

    if (ModelState.IsValid) {    
     db.SaveChanges(); 
     return RedirectToAction("Index"); 
    } 
    return View(service); 
} 

有沒有辦法實現這個烏托邦夢想,還是我找錯了樹?我願意使用其他技術(如普通EF4,Automapper等)

在此先感謝!

回答

0

只有默認的模型聯編程序?可能不會。

有自定義嗎?大概。

但是,您的問題不會是模型聯編程序本身。你的問題是,EF和ORM以及(我認爲)通常不會考慮從集合中刪除一個項目作爲刪除操作。實際上,您告訴ORM的關係不存在,而不是需要刪除子行。根據您的映射,您通常會收到「發生參照完整性約束違規事件」等錯誤。這不會因爲代碼第一,這就是EF的工作原理。

EF通過設計以這種方式工作,對於更復雜的關係非常重要,例如當您擁有引用其他m2m關係的m2m關係時。您真的希望EF能夠消除呼叫以消除關係並呼籲完全移除行。另外,恕我直言,這種技術也是不好的,因爲你讓負責映射http值的代碼也決定了對象應該如何持久化。這是一個不好的舉措。我認爲刪除操作是非常神聖的行爲,不應該僅僅留給ModelBinder。沒有軟刪除或記錄刪除對象應被視爲「嚴重的業務」。

+0

謝謝jfar ..所以,如果你需要發佈一個單一的形式,其中更新到一個實體,它的子女和孫子們 - 你會怎麼做呢?用DTOs?然後手動更新實體圖以反映保存前的DTO內容? – Brendan 2011-01-25 00:23:43