【发布时间】: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