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

.net .net-3.5 ado.net entity-framework visual-studio

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

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

有什么我想念的,或者这是一个错误?
任何解决方法?


使用Visual Studio 2008 v9.0.30729.1 SP(Service Pack 1)

一般承认的答案

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


热门答案

由于现在唯一有效的方法是将返回类型映射到实体,因此一种解决方法是创建与返回数据对应的视图并为视图创建实体。这仅在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之间设置完全相同的列名。托比




许可下: CC-BY-SA with attribution
不隶属于 Stack Overflow
这个KB合法吗? 是的,了解原因
许可下: CC-BY-SA with attribution
不隶属于 Stack Overflow
这个KB合法吗? 是的,了解原因