2011-05-27 53 views
1

我是ASP.NET MVC的新手,希望創建一個小訂單管理工具。我的數據庫包含表訂單和文章(和其他幾個),並且我從我的數據庫生成了一個EF模型,因此我可以使用EF映射的全部功能(例如db.Orders.Articles)實體框架錯誤 - 嵌套模型問題

我的我關心的兩個主要關係是訂單和文章。

  • 一個訂單可以有很多文章
  • 的一篇文章只能屬於一個數量級。

我創建了一個OrdersController與創建行動,創建一個訂單:

 // 
    // GET: /Orders/Create 

    public ActionResult Create() 
    { 
     Order order = new Order() 
     { 
      // filling some order columns, e.g. date 
     }; 

     Article article = new Article() 
     { 
      // ... article columns 
     }; 

     order.Articles.Add(article); 

     return View(order); 

    } 

    // 
    // POST: /Orders/Create 

    [HttpPost] 
    public ActionResult Create(Order order) 
    { 
     // i know i should care more about error handling, but now ommit it 
     db.Orders.AddObject(order); 
     db.SaveChanges(); 

     return RedirectToAction("index"); 
    } 

所以我的EF對象正在直接綁定到一個視圖(讀的地方沒有做到這一點,使用查看模型,但不真正知道該視圖模型應該看起來像什麼)

我的視圖包含訂單表單以及文章表單(因爲我想創建一個訂單和文章在同一時間而不是單獨的)。我用這些greate EditorFor方法來做到這一點。

而現在我的問題:如果我點擊提交按鈕,應用程序,一旦崩潰,因爲它涉及到HttpPost創建方法與此錯誤消息(映射訂單時):

錯誤信息: EntityCollection 已經初始化。應該只調用 InitializeRelatedCollection方法 來初始化 新的EntityCollection,該對象圖的反序列化過程爲 。

如果我打在VS2010中繼續,它會完成保存命令 - 所以我的問題是如何以可靠的方式解決這個問題。

在此先感謝和抱歉的是很長的故事:)

+2

我的建議是不要使用EF對象模型,並創建一個'ViewModel'代替(如你在你的問題提)。 'ViewModel'應該包含你要在視圖中顯示/編輯的所有字段,所以最初你可以創建一個實體對象的副本並將它們命名爲'OrderViewModel'和'ArticleViewModel',而'OrderViewModel'將包含一個「ArticleViewModels」列表。在'Create'操作中,您只需確保將所有數據從視圖模型複製到EF對象中(此過程可以自動化 - 請參閱Automapper)。 – Yakimych 2011-05-27 12:55:04

回答

1

現在我解決我的問題,通過使用獨立的視圖模型像@Yakimych勸我。但是我沒有複製EF模型中的所有屬性,而只是引用它們。我的視圖模型看起來是這樣的:

public class NewOrderViewModel { 
    public Order { get; set; } 
    public List<Article> { get; set; } 
}