65.9K
CodeProject 正在变化。 阅读更多。
Home

在 WCF 数据服务中公开存储过程

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.57/5 (5投票s)

2010年10月25日

CPOL

2分钟阅读

viewsIcon

50830

如何在 WCF 数据服务中公开存储过程

今天,我在数据平台开发论坛上回答了一个问题。问题很简单——如何通过 Entity Framework 模型将映射到存储过程的存储过程通过 WCF 数据服务 公开。 这篇文章将向您展示如何做到这一点。

存储过程

首先,我创建了以下存储过程

CREATE PROCEDURE dbo.GetCoursesOrderByTitle
AS

BEGIN
    SET NOCOUNT ON 

    SELECT CourseID, Title, Days, [Time], Location, Credits, DepartmentID
    FROM Course

    ORDER BY Title ASC
END

该过程很简单,它返回按标题排序的所有课程。 当然,这可以通过使用 LINQ to Data Services 来实现,但我希望展示在 WCF 数据服务 中公开存储过程的概念。

模型

创建存储过程后,我创建了 Entity Framework 模型,为了简单起见,该模型仅包含一个课程实体,并将存储过程映射为模型中的 FunctionImport。 如果您想了解如何创建这种映射,请访问我之前写的一篇旧文章。 模型看起来如下

Entity Designer Diagram   Model Browser

创建 WCF 数据服务

在拥有模型之后,让我们创建 WCF 数据服务。 为了公开存储过程,我们需要创建一个服务操作方法。 服务操作是在 WCF 数据服务 中可以创建的端点,以便添加无法由服务 RESTful 接口支持的业务逻辑。 这些端点像 WCF 数据服务 公开的 REST 接口中的任何其他端点一样被消费。 有关服务操作的更多阅读,我推荐以下两篇文章

让我们看一下服务

public class SchoolDataService : DataService<SchoolEntities>
{
  public static void InitializeService(DataServiceConfiguration config)
  {
    config.SetEntitySetAccessRule("Courses", EntitySetRights.AllRead);
    config.SetServiceOperationAccessRule("GetCoursesOrderByTitle", ServiceOperationRights.AllRead);

    config.DataServiceBehavior.MaxProtocolVersion = DataServiceProtocolVersion.V2;
  }
 
  [WebGet]
  public IQueryable<Course> GetCoursesOrderByTitle()
  {
    return CurrentDataSource
      .GetCoursesOrderByTitle()

      .AsQueryable();
  }
}

如您所见,我使用 CurrentDataSource 来获取 Entity Framework ObjectContext,然后使用其 FunctionImport 执行存储过程。 我还需要设置 服务操作 访问规则以公开该操作。 如果我想立即而不是从客户端消费服务操作,我可以在浏览器中查看该服务,然后创建以下链接,例如,以调用该操作

https://:43054/SchoolDataService.svc/GetCoursesOrderByTitle  

结果将是

Runing Service Operation

摘要

通过 WCF 数据服务 公开存储过程可以通过使用 服务操作 功能提供服务端点来实现。 在这篇文章中,我展示了如何使用 Entity Framework 来做到这一点。

© . All rights reserved.