RIA服务 - 调用存储过程

时间:2010-09-21 00:04:13

标签: silverlight entity-framework wcf-ria-services

我正在使用Silverlight和Entity Framework的RIA服务。我想调用存储过程并将结果映射到数据网格。做这个的最好方式是什么?存储过程的输出不会映射到任何表设计。

我找到了以下文章 -

http://blogs.msdn.com/b/tom/archive/2009/05/07/silverlight-ria-calling-stored-procedures-that-don-t-return-tables.aspx

但是,它对我不起作用 - 我得到一个错误,说结果复杂集没有定义主键。我无法看到如何在代码中定义它。

无论如何,我对所有解决方案都持开放态度。

2 个答案:

答案 0 :(得分:3)

我在这个网站找到了以下优秀的分步指南 -

http://betaforums.silverlight.net/forums/p/218383/521023.aspx

1)将ADO实体数据模型添加到Web项目中;选择generate from database选项;选择要连接的数据库实例。

2)选择要导入模型的数据库对象。您可以展开“表”节点以选择要导入到模型的任何表。展开“存储过程”节点以选择“存储的过程”。单击“完成”以完成导入。

3)右键单击数据库模型设计器以选择“添加/功能导入”。为函数命名(与SP名称相同),然后选择要映射的存储过程。如果您的SP仅返回一个字段,则可以将返回结果映射到标量集合。如果您的SP返回多个字段,您可以将返回结果映射到集合或实体(如果所有字段都来自单个表)或复杂类型的集合。

如果要使用复杂类型,可以单击“获取列”按钮以获取SP的所有列。然后单击“创建新的复杂类型”按钮以创建此复杂类型。

4)将一个Domain Service类添加到Web项目中。选择刚刚创建的DataModel作为此Service的DataContext。选择要向客户端公开的所有entitis。应为这些实体生成服务功能。

5)您可能在实体列表中看不到复杂类型。您必须在服务中为您的SP添加查询功能: 假设您的SP名为SP1,您生成的复杂类型称为SP1_Result。

在域服务类中添加以下代码:

public IQueryable<SP1_Result> SP1()
    {
        return this.ObjectContext.SP1().AsQueryable();            
    }

现在您可以编译您的项目了。您可能会收到如下错误:“SP1_Result没有密钥”(如果您没有使用RIA服务SP1测试版)。如果这样做,您需要在服务元数据文件中执行以下操作:

添加了一个SP1_Result元数据类并标记了Key字段:

[MetadataTypeAttribute(typeof(SP1_Result.SP1_ResultMetadata))]
public partial class SP1_Result
{
    internal sealed class SP1_ResultMetadata
    {
        [Key]
        public int MyId;  // Change MyId to the ID field of your SP_Result
    }
} 

6)编译您的解决方案。现在您已将SP1_Result公开给客户端。检查生成的文件,您应该看到SP1_Result是作为Entity类生成的。现在,您可以在Silverlight代码中访问DomainContext.SP1Query和DomainContext.SP1_Results。您可以像处理任何其他实体(映射到表的实体)类一样对待它。

答案 1 :(得分:2)

好吧,我想办法怎么做,虽然它有点乱。您需要在域元数据文件中为结果集创建元数据类。在那之后,RIA将基本上像对待实体一样对待它。

完整详情可在此处找到 - http://leeontech.wordpress.com/2010/05/24/ria-services-and-storedprocedures/