2011-05-27 57 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; } 
}