【发布时间】:2011-05-27 11:50:21
【问题描述】:
我是 ASP.NET MVC 的新手,想创建一个小型订单管理工具。我的数据库包含表 Orders 和 Articles(以及其他一些表),并且我从我的数据库中生成了一个 EF 模型,因此我可以使用 EF 映射的全部功能(例如 db.Orders.Articles)
我关心的两个主要关系是订单和文章。
- 一个订单可以有很多文章
- 一篇文章只能属于一个订单。
我创建了一个带有 Create 操作的 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 对象绑定到一个视图(在某处读到不要这样做,而是使用视图模型,但不知道该视图模型应该是什么样子)
我的视图包含订单表单和文章表单(因为我想同时创建订单和文章,而不是分开)。我使用了这些很棒的 EditorFor 方法来做到这一点。
现在我的问题是:如果我点击提交按钮,应用程序会在涉及到 HttpPost 创建方法(映射订单时)时立即崩溃,并显示以下错误消息:
错误消息:EntityCollection 已经初始化了。这 InitializeRelatedCollection 方法 应该只被调用来初始化一个 新 EntityCollection 期间 对象图的反序列化。
如果我在 VS2010 中点击继续,它将完成保存订单 - 所以我的问题是如何以可靠的方式解决这个问题。
在此先感谢,并为这个长篇大论感到抱歉:)
【问题讨论】:
-
我的建议是不要使用 EF 对象作为您的模型,而是创建一个
ViewModel(正如您在问题中提到的那样)。ViewModel应该包含您将在视图中显示/编辑的所有字段,因此最初您可能只是创建实体对象的副本并将它们命名为OrderViewModel和ArticleViewModel,OrderViewModel将包含一个ArticleViewModels的列表。在Create操作中,您只需确保将视图模型中的所有数据复制到 EF 对象中(此过程可以自动化 - 看看 Automapper)。
标签: asp.net entity-framework asp.net-mvc-3