0

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

然后客户端可以更改实体或更新它。在这一点上我相信它是自我跟踪?这是我有点困惑的地方,因为有很多关于 STE 不跟踪的报告问题。

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

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

所以基本上单靠这个是行不通的??

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

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

我可以在来自客户端的每个方法调用中创建和销毁 WCF 服务 - 因此每次实际上创建一个新的对象上下文。

我知道让对象上下文保持很长时间并不是一个好主意。

4

2 回答 2

3

您问了几个问题,所以我将尝试分别回答:

返回 IQueryable:

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

客户跟踪:

是的,如果客户端使用 STE,STE 可以跟踪客户端的更改!使用 STE 的组装应该在服务和客户端之间共享。

共享对象上下文:

切勿在更新数据的服务器环境中共享 ObjectContext。始终为每次调用创建新的 ObjectContext 实例。我在这里描述了原因。

连接 STE

您不需要附加 STE。ApplyChanges 将为您做所有事情。此外,如果您想从您的服务操作中退回订单,您应该在其上调用 AcceptChanges。

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

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

在客户端上重用服务代理:

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

于 2011-01-09T14:02:47.880 回答
0

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

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

我会这样做的方式是:

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

编辑

正如评论中所指出的,以上是针对 POCO 的

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

于 2011-01-09T16:33:58.603 回答