RIA服务,EF和存储过程

时间:2009-11-26 13:40:24

标签: .net entity-framework stored-procedures entity-framework-4

我现在有这个问题2个月了

如何使用RIA存储过程。

我正在使用LinqToSql并且正常工作。

我在设计师中创建了一个类并将其映射到SP。

现在在EF中,我看到了这个ComplexTypes,我导入了儿子SP,结果是ComplexTypes。

但是在DomainDataSource中没有出现。

行。

但我该如何使用它们?

我只需要检索一些数据。

我已尝试过所有解决方案(List,IList等),但我得到了

无法将类型为“System.Data.Metadata.Edm.ComplexType”的对象强制转换为“System.Data.Metadata.Edm.EntityType”。 BusinessApplication2

有任何解决方案吗?

2 个答案:

答案 0 :(得分:1)

存储过程的问题是RIA服务工具无法“看到”存储过程将返回哪些列。

因此,有很多代码丢失,否则将会生成。

不是您正在寻找的答案,但解决方案是不使用存储过程。

答案 1 :(得分:0)

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

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。您可以像处理任何其他实体(映射到表的实体)类一样对待它。