【问题标题】:Entity Framework error - nested model problem实体框架错误 - 嵌套模型问题
【发布时间】: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 应该包含您将在视图中显示/编辑的所有字段,因此最初您可能只是创建实体对象的副本并将它们命名为 OrderViewModelArticleViewModelOrderViewModel 将包含一个ArticleViewModels 的列表。在Create 操作中,您只需确保将视图模型中的所有数据复制到 EF 对象中(此过程可以自动化 - 看看 Automapper)。

标签: asp.net entity-framework asp.net-mvc-3


【解决方案1】:

我现在通过使用像 @Yakimych 建议我的单独 ViewModel 解决了我的问题。但是,我没有从 EF 模型中复制所有属性,而是仅引用它们。我的 ViewModel 如下所示:

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

【讨论】:

    猜你喜欢
    • 2013-06-05
    • 1970-01-01
    • 1970-01-01
    • 2014-08-06
    • 2018-01-27
    • 2010-10-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多