【问题标题】:Is it possible to store ObjectContext on the client when using WCF and Entity Framework?使用 WCF 和实体框架时,是否可以在客户端存储 ObjectContext?
【发布时间】:2010-03-21 12:18:53
【问题描述】:

我有一个 WCF 服务,它对我的​​数据模型执行 CRUD 操作:添加、获取、更新和删除。我正在为我的数据模型使用实体框架。 另一方面,有一个客户端应用程序调用 WCF 服务的方法。

例如我有一个客户类:

[DataContract]
public class Customer
{
   public Guid CustomerId {get; set;}
   public string CustomerName {get; set;}
}

WCF 服务定义了这个方法:

public void AddCustomer(Customer c)
{
    MyEntities _entities = new MyEntities();
    _entities.AddToCustomers(c);
    _entities.SaveChanges();
}

客户端应用程序将对象传递给 WCF 服务:

var customer = new Customer(){CustomerId = Guid.NewGuid, CustomerName="SomeName"};
MyService svc = new MyService();
svc.Add(customer); // or svc.Update(customer) for example

但是当我需要将大量对象传递给 WCF 时,这可能是一个性能问题,因为我每次执行 Add()、Update()、Get() 或 Delete 时都需要创建 ObjectContext ()。

我的想法是将 ObjectContext 保留在客户端,并将 ObjectContext 作为附加参数传递给 wcf 方法。

是否可以在客户端上创建并保留 ObjectContext 并且不为每个操作重新创建它?如果不是,如何加快向 wcf 服务传递大量数据的速度?

谢尔盖

【问题讨论】:

    标签: c# wcf entity-framework


    【解决方案1】:

    不,无法通过 WCF 服务调用序列化 ObjectContext。

    实体框架的当前版本并不真正支持像这样的 n 层应用程序。

    我们有一个使用实体框架的 n 层应用程序,我们每次都将我们的对象从 ObjectContext 中分离出来,并为每次调用重新创建和重新附加,它工作正常。进行娱乐似乎没有任何显着的性能成本(SQL 服务器无论如何都会汇集数据库连接),所以除非您正在做一些需要非常高吞吐量的事情,否则不要过早地进行优化。让它运行,然后对其进行分析。老实说,您最大的瓶颈将是 WCF 服务调用和网络上的数据传输,因此,如果您希望提高性能,请尽量减少传输的数据量,而不是担心您的 ObjectContext。或者,您可以创建一个服务调用,它接受一个对象列表并同时添加它们。

    不过,EF4 会做得更好。有关 EF4 中的 n 层支持的更多信息,请查看 this MSDN 文章。如果您使用 Beta 版或等待一个月的发布,可能值得一看。

    【讨论】:

      【解决方案2】:

      Entity Framework 中的ObjectContext 类是围绕Unit of Work 的概念设计的。其目的是跟踪对实体对象中包含的数据所做的一些更改,然后将这些更改作为批处理应用到底层数据库(通过ObjectContext.SaveChanges 方法)。
      工作单元具有明确定义的界限并设计为在有限的时间内持续。在 Entity Framework 中,工作单元是通过 ObjectContext 以这种方式实现的:

      using (var db = new ObjectContext()) // The unit of work starts with the constructor
      {
          // perform work
      } // The unit of work ends with the Dispose method
      

      ObjectContext 旨在在需要对数据库中的数据执行某些工作时临时创建和处置,因此在这个意义上它被设计为轻量级的。

      话虽如此,我不相信保留一个长期存在的 ObjectContext 实例会提高应用程序的性能。相反,它会导致 ObjectContext 实例在继续跟踪更多操作时消耗更多内存。

      如果您需要通过网络传输大量数据,最好的办法是使用快速轻量级的通信协议。在 WCF 中,您可以使用netTcpBinding,它通过 TCP 连接传输二进制格式的消息。请务必记住,这只适用于两端都使用 .NET 的情况,因为使用的二进制格式是特定于 .NET 的。

      【讨论】:

        【解决方案3】:

        不,您不能将 ObjectContext 保留在客户端(以这种方式使用 WCF 有什么问题?),但是您可以在 Service 上实现延迟更改保存或创建方法 AddCostumers(Customer[] customers)

        【讨论】:

          猜你喜欢
          • 2014-01-06
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多