2009-02-23 51 views
8

我在我的实体数据模型中有一个存储过程,并将其添加到函数导入中。具有非实体返回类型的实体模型中的函数导入

问题是...... Visual Studio在模型的代码隐藏中生成函数代码当且仅当我指定返回为实体类型时。 标量和空返回类型不起作用。当我选择它们时,Visual Studio不会生成功能代码。

有什么我想念,或者这是一个错误?
任何变通?


使用Visual Studio 2008 v9.0.30729.1 SP(服务包1)

回答

8

这不是那么多,因为它是缺乏一个功能的缺陷。实体框架现在不支持返回标量值的存储过程。我相信这应该在.NET 4.0中改变。同时,您可以使用店面连接执行这样的存储过程,可通过CreateDbCommand获得。

+0

谢谢。用户界面具有欺骗性,因为它允许用户选择标量和空返回类型。 – 2009-02-23 17:59:49

+0

我有使用CreateDbCommand的后续问题。请参阅:http://stackoverflow.com/questions/587173/execute-a-stored-procedure-in-entity-framework-from-within-an-ado-net-dataservice – 2009-02-25 18:14:47

4

由于现在唯一有效的工作是将返回类型映射到实体,所以一种解决方法是创建一个与返回数据对应的视图并为该视图创建一个实体。这只有在SP执行SELECT返回结果集而不是返回值时才有效。我这有一个示例应用程序的工作,像这样: SP:

ALTER PROCEDURE [dbo].[DoSomething] 
    @param1 varchar(50), 
    @param2 varchar(50) 
AS 
BEGIN 
    DECLARE @ID INT 
    SET NOCOUNT ON; 
    INSERT tmp_header (fname, lname) VALUES (@param1, @param2) 
    SET @ID = SCOPE_IDENTITY() 
    SELECT @ID AS 'id' 
END 

VIEW:

CREATE VIEW [dbo].[View_1] 
AS 
SELECT 0 as id 

创建函数导入设置返回类型View_1和建立模型。

代码:

class Program 
    { 
     static void Main(string[] args) 
     { 
     using (PS_RADSTESTEntities ctx = new PS_RADSTESTEntities()) 
     { 
      EntityConnection ec = ctx.Connection as EntityConnection; 
      ec.Open(); 
      DbTransaction txn = ec.BeginTransaction(); 
      ObjectResult<View_1> result = ctx.DoSomething("Toby", "Kraft"); 
      View_1 row = result.Single(); 
      int id = row.id; 
// do some other interesting things ... 
      ctx.SaveChanges(); 
      txn.Commit(); 
     } 
     } 
    } 

一定要设置列名的视图和SP之间的完全一样。 托比

相关问题