在 WCF 数据服务中公开存储过程
如何在 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
。 如果您想了解如何创建这种映射,请访问我之前写的一篇旧文章。 模型看起来如下
创建 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
结果将是
摘要
通过 WCF 数据服务 公开存储过程可以通过使用 服务操作 功能提供服务端点来实现。 在这篇文章中,我展示了如何使用 Entity Framework 来做到这一点。