我应该使用数据集或实体框架通过WCF服务传输数据吗?

我应该使用数据集或实体框架通过WCF服务传输数据吗?,wcf,entity-framework,strongly-typed-dataset,Wcf,Entity Framework,Strongly Typed Dataset,我正在进行应用程序设计,并研究在WCF服务和ASP.NET web应用程序之间传递数据。我看到的选项是使用“数据集”或实体框架 我有很多问题 如果我使用实体框架来传递数据,会不会增加WCF通信的开销 考虑到通信开销,是否将数据集视为“轻量级”数据集 如果我使用实体框架,如果我使用存储过程返回复杂数据,我如何维护对象模型 总的来说,我需要找出使用这些技术的利弊 您的问题涉及面向服务的体系结构(SOA)的原则。在SOA中,服务应该通过契约公开应用于业务对象的操作(方法)。业务对象应该以标准的方式定义

我正在进行应用程序设计,并研究在WCF服务和ASP.NET web应用程序之间传递数据。我看到的选项是使用“数据集”或实体框架

我有很多问题

  • 如果我使用实体框架来传递数据,会不会增加WCF通信的开销
  • 考虑到通信开销,是否将数据集视为“轻量级”数据集
  • 如果我使用实体框架,如果我使用存储过程返回复杂数据,我如何维护对象模型

  • 总的来说,我需要找出使用这些技术的利弊

    您的问题涉及面向服务的体系结构(SOA)的原则。在SOA中,服务应该通过契约公开应用于业务对象的操作(方法)。业务对象应该以标准的方式定义,这就是为什么WCF使用WSDL和XML模式来实现这一点

    SOA原则是通过模式和/或契约共享业务对象,而不是作为特定的实现。根据这一原则,Dataset是一个重量级、.NET特定的、面向数据库的对象,不应用于表示业务对象。微软模式与实践小组显然忽视了SOA原则,因为不管他们是在促进供应商锁定还是在破坏SOA的整个概念,都是任何人的猜测。如果您的服务有可能被非.NET客户端使用,请不要使用数据集


    如果您决定使用实体框架,那么我建议使用来定义实体框架数据模型,并在您的服务中公开那些“代码优先”的业务对象。这为在WCF中使用实体框架提供了一个很好的讨论。

    您的问题涉及到面向服务的体系结构(SOA)的原则。在SOA中,服务应该通过契约公开应用于业务对象的操作(方法)。业务对象应该以标准的方式定义,这就是为什么WCF使用WSDL和XML模式来实现这一点

    SOA原则是通过模式和/或契约共享业务对象,而不是作为特定的实现。根据这一原则,Dataset是一个重量级、.NET特定的、面向数据库的对象,不应用于表示业务对象。微软模式与实践小组显然忽视了SOA原则,因为不管他们是在促进供应商锁定还是在破坏SOA的整个概念,都是任何人的猜测。如果您的服务有可能被非.NET客户端使用,请不要使用数据集


    如果您决定使用实体框架,那么我建议使用来定义实体框架数据模型,并在您的服务中公开那些“代码优先”的业务对象。这为在WCF中使用实体框架提供了一个很好的讨论。

    您真的在考虑上下传递整个数据集吗?这将破坏您的对象模型,并且更难维护,尽管我认为您可以实现存储库模式。尽管如此,即使只是发送更改,您也需要做一些奇怪的事情,比如确保不传输模式,或者使用compress选项。但是,与实体框架代码相比,它是一个非常糟糕的选择。首先,在单独的程序集中使用干净的POCO,并且没有任何EF基础设施污染DTO

    EF本身不应该增加开销,但这取决于它是如何实现的以及传递的数据对象。如果将数据传递到上下文中,并在调用
    SaveChanges
    时使用正确的选项,例如
    SaveChangesOptions.replaceoupdate
    ,则只会更新已更改的实体。只要你注意不要延迟加载你不需要的东西,执行的查询是有效的。您需要很好地理解LINQtoEntities,并像处理任何其他可能昂贵的方法调用一样批量更新。在运行数据库探查器的情况下运行一些测试,并尝试提高与EF的交互效率,监视IIS日志中的数据大小和传输时间等

    由于需要封装一个模式,数据集不被认为是轻量级的,并且可能有人会犯错误,在多个表中发送整个数据堆,包括依赖表。无论是在客户端还是服务器上,这些都可能需要拉进来——非常混乱!EF确实以合理的方式支持存储过程,因为它们可以是模型的一部分,并在需要保存特定实体时被调用。ORM将称赞您的OO设计,并带来更干净的代码


    此外,如果你正在做一些简单的事情,只需要在业务逻辑的方式上不考虑CRUD,那么考虑WCF数据服务。

    < P>你真的考虑上下传递整个数据集吗?这将破坏您的对象模型,并且更难维护,尽管我认为您可以实现存储库模式。尽管如此,即使只是发送更改,您也需要做一些奇怪的事情,比如确保不传输模式,或者使用compress选项。但是,与实体框架代码相比,它是一个非常糟糕的选择。首先,在单独的程序集中使用干净的POCO,并且没有任何EF基础设施污染DTO

    EF本身不应该增加开销,但这取决于它是如何实现的以及传递的数据对象。如果将数据传递到上下文中,并在调用
    SaveChanges
    时使用正确的选项,例如
    SaveChangesOptions.replaceoupdate
    ,则只会更新已更改的实体。只要你注意不要延迟加载你不需要的东西,执行的查询是有效的。您需要很好地理解LINQtoEntities,并像其他任何可能昂贵的方法一样批量更新