EF4 + STE:通过WCF服务重新连接?每次都使用新的objectcontext?

时间:2011-01-09 10:16:45

标签: silverlight wcf entity-framework-4 self-tracking-entities

我计划将WCF(不是ria)与Entity Framework 4和STE(自我跟踪权限)结合使用。如果我正确地理解这一点,我的WCF应该返回一个实体或实体集合(例如使用LIST而不是IQueryable)给客户端(在我的情况下是silverlight)

然后,客户端可以更改实体或更新实体。此时我相信这是自我跟踪????这是我有点困惑的地方,因为有很多报道的问题与STE没有跟踪..

无论如何......然后更新我只需要将实体发送回我的WCF服务另一种方法来进行更新。我应该每次创建一个新的OBJECTCONTEXT?在每种方法中?

如果我每次在WCF上的每个方法创建一个新的objectcontext,那么我不需要将STE重新附加到objectcontext吗?

所以基本上这根本不起作用?

using(var ctx = new MyContext())
{
    ctx.Orders.ApplyChanges(order);
    ctx.SaveChanges();
}

或者我应该在WCF服务的构造函数中创建一次对象上下文,以便1次调用和使用相同wcf实例的每个附加调用使用相同的objectcontext?

我可以在客户端的每个方法调用中创建和销毁wcf服务 - 因此每次都会创建一个新的objectcontext。

我知道将objectcontext保持很长时间并不是一个好主意。

非常感谢任何见解或信息

感谢

2 个答案:

答案 0 :(得分:3)

您提出了几个问题,因此我将尝试单独回答:

返回IQueryable:

你无法归还IQueryalbe。 IQueryable描述了应该执行的查询。当您尝试从服务返回IQueryable时,它将在服务响应的序列化期间执行。它通常会导致异常,因为ObjectContext已经关闭。

跟踪客户:

是的,如果客户使用STE,STE可以跟踪客户的变化!应在服务和客户之间共享与STE的汇编。

分享ObjectContext:

永远不要在更新数据的服务器环境中共享ObjectContext。始终为每个调用创建新的ObjectContext实例。我描述了原因here

附加STE

您无需附加STE。 ApplyChanges将为您做一切。此外,如果您想从服务操作中退回订单,您应该在其上调用AcceptChanges。

在服务构造函数中创建对象上下文:

请注意,WCF有自己的规则如何使用服务实例。这些规则基于InstanceContextMode并使用了绑定(您可以通过实现IInstanceProvider实现自己的规则)。例如,如果您使用BasicHttpBinding,则默认实例化将是PerCall,这意味着WCF将为每个请求创建新的服务实例。但是,如果您使用NetTcpBinding,则默认实例化将是PerSession,WCF将为单个客户端(单个客户端代理实例)的所有请求重用单个服务实例。

在客户端重用服务代理:

这还取决于使用的绑定和服务实例。使用面向会话的绑定时,客户端代理与单个服务实例相关。在该代理上调用方法将始终在同一服务实例上执行操作,因此服务实例可以是有状态的(可以包含在调用之间共享的数据)。这通常不是一个好主意,但它是可能的。使用面向会话的连接时,您必须处理可能出现的几个问题(它更复杂)。 BasicHttpBinding不允许会话,因此即使使用单个客户端代理,每个调用都由新服务实例处理。

答案 1 :(得分:0)

您可以将实体附加到新的对象上下文,请参阅http://msdn.microsoft.com/en-us/library/bb896271.aspx

但是,它将使状态保持不变。

我这样做的方式是:

  • 重新查询数据库以获取信息
  • 将其与
  • 中发送的对象进行比较
  • 使用更改
  • 从数据库更新实体
  • 然后执行正常的保存更改

修改

上述内容适用于POCO,正如评论

所述

对于STE,您每次都创建一个新的上下文,但使用“ApplyChanges”,请参阅:http://msdn.microsoft.com/en-us/library/ee789839.aspx