【问题标题】:Saving a ObjectContext depended object after two requests (EF/MVC 3)在两次请求后保存 ObjectContext 依赖的对象 (EF/MVC 3)
【发布时间】:2012-06-28 18:33:53
【问题描述】:

使用 EntityFramework,我正在结合 MVC 3 尝试以下操作。

我有一个ObjectContext,它在每个请求开始时被初始化,并在请求结束时被释放。很像一个简单的UnitOfWork 实现。现在考虑有一个Order 类(EF 生成),它将被初始化。我将ObjectContext 传递给通过重载的构造函数使用。

var order = new Order(myObjectContext);

然后在Order 类中保留此实例(私有字段)。在我设置了这个Order 实例的一些属性之后(使用相同的ObjectContext)。我想将此实例放在用户会话中,因为在准备保存订单之前需要第二个网页来填充一些信息。

这是我卡住了,在用户提交第二个网页后,我从会话中检索 Order 对象,设置更多属性并在 ObjectContext 引用上点击 .SaveChanges() Order 对象.所以第一个请求中提出的那个。我认为这是必需的,因为在第一个请求期间(创建 Order 时)一些其他实体被添加到一个订单集合中。所以我必须再次使用相同的上下文。问题是,在点击.SaveChanges() 之后,该方法没有返回任何错误或任何错误,但数据没有保存在数据库中。甚至身份值也不会从零开始变化。没有提交任何内容。

当我第一次尝试将对象添加到集合中时:

this._context.Order.AddObject(this);
this._context.SaveChanges();

请注意,此代码在一个方法中,放置在部分 Order 类中。这一次,在.AddObject() 我收到消息:

An entity object cannot be referenced by multiple instances of IEntityChangeTracker.

我试图将 Order 对象从它的原始上下文中分离出来,并将其重新附加到第二个请求中发出的上下文,但这当然不起作用,因为 Order 属性之一是其他实体的集合,已检索并在第一个请求中添加,因此使用第一个 ObjectContext

也许我可以通过在第一个请求结束时调用.SaveChanges() 来解决这个问题。然后在下一个请求中,我必须使用该请求的ObjectContext 从数据库中提取订单。问题是,我不想在第二个请求结束之前保存 Order

在我看来,会话中与Order 实例一起保存的ObjectContext 需要“连接刷新”?

【问题讨论】:

    标签: c# asp.net-mvc-3 entity-framework-4


    【解决方案1】:

    我不确定我是否理解您要执行的操作,但您似乎想对 Order 对象进行几处更改,并且仅在应用所有更改后才保存它。如果我错了,请纠正我,但我认为您将 ObjectContext 作为参数传递给 Order 对象,然后将 Order 对象放入会话中以嵌入连接并将其维护到下一页?

    这可能是您的实体对象和 ObjectContext 断开连接的地方。

    我建议您看看自我跟踪实体生成器 - http://msdn.microsoft.com/en-us/library/ff407090.aspx。也许这会对你有所帮助 - http://henrycomputerworld.blogspot.no/2012/01/save-temporary-data-with-entity.html

    这应该允许您根据需要执行尽可能多的回发,并让 Order 实例跟踪它自己的更改。然后,您应该能够在单个 ObjectContext 实例上提交更改。

    如果这没有帮助,也许您可​​以提供更多代码和解释。

    【讨论】:

    • 我认为您完全正确,我将研究您提供的信息。谢谢。
    • 我希望你能弄清楚。如果这对您有所帮助,请记住将答案标记为正确:)
    • 虽然我没有使用您的解决方案(而是完全更改了一些应用程序设计),但它似乎是解决我最初问题的有效解决方案。因此,我将您的答案标记为正确。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-31
    • 2016-10-30
    • 2023-03-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多