-1

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

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

var order = new Order(myObjectContext);

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

这是我被卡住了,在用户提交第二个网页后,我Order从会话中检索对象,设置更多属性并点击对象.SaveChanges()ObjectContext引用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在第二个请求结束之前保存。

ObjectContext对我来说,会话​​中与实例一起保存的似乎Order需要“连接刷新”?

4

1 回答 1

0

我不确定我是否理解您要执行的操作,但您似乎想对 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 实例上提交更改。

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

于 2012-06-28T10:24:40.133 回答