具有非實體返回類型的實體模型中的函數導入

.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合法嗎? 是的,了解原因