我计划将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保持很长时间并不是一个好主意。
非常感谢任何见解或信息
感谢
答案 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