具有非实体返回类型的实体模型中的函数导入

时间:2009-02-23 17:32:34

标签: .net visual-studio entity-framework .net-3.5 ado.net

我的实体数据模型中有一个存储过程,并将其添加到函数imports。

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

我缺少什么,或者这是一个错误? 任何解决方法?

<小时/> 使用Visual Studio 2008 v9.0.30729.1 SP(Service Pack 1)

3 个答案:

答案 0 :(得分:8)

这不是一个错误,因为缺少一个功能。实体框架现在不支持返回标量值的存储过程。我相信这应该在.NET 4.0中改变。在此期间,您可以使用通过CreateDbCommand提供的商店连接来执行此类存储过程。

答案 1 :(得分: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

查看:

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

创建函数import,将返回类型设置为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之间设置完全相同的列名。 托比

答案 2 :(得分:3)