如何在ADO.NET Entity Framework中使用存儲過程

.net c# entity-framework linq

我有3張桌子;我在ADO.NET Entity Framework中編寫了一個存儲過程。

ALTER PROCEDURE [dbo].[sp_GetDepartmanData]
(@departman nvarchar(50))
BEGIN
  SELECT  
    d.ID, d.Name as DepartmanName,  
    sb.Salary, sb.email,
    sp.Name, sp.SurName, sp.Phone, sp.Married, sp.Address
  FROM         
    Departman d 
  INNER JOIN StaffsBusiness sb ON d.ID = sb.StaffsPersonelDepartmanID
  INNER JOIN StaffsPersonel sp ON sb.StaffsPersonelID = sp.ID 
  WHERE
    d.Name = @departman
END

我需要一個我在下面寫的存儲過程函數:

var staffPersonel = staffContext.GetPersonelInformationWithDepartmanID("Yazılım");

gvPersonel.DataSource = staffPersonel;
gvPersonel.DataBind();

GetPersonelInformationWithDepartmanID函數我從SQL編寫(ADO.NET實體框架中的用戶定義函數)有3種替代方案(很傻!!!)但我有3個joininig表!!!如果我之前加入3桌,我該如何使用?

一般承認的答案

好的,你需要在這裡做幾步:

  • 將存儲過程sp_GetDepartmanData添加到您的Entity Framework模型中(另外 - 強烈建議不要調用存儲過程sp_(something) - 使用sp_前綴保留給僅限Microsoft的系統存儲過程)
  • 由於存儲過程返回一組數據,因此在使用存儲過程之前,首先需要為它創建一個概念實體;在實體設計器中,創建一個新實體並將其稱為一些有用的名稱,如DepartmentDataEntityType或其他;將從存儲過程返回的所有字段添加到該實體類型
  • 現在,您可以在實體數據模型中創建函數導入 - 轉到模型瀏覽器,在“model.store”部分轉到存儲過程,然後右鍵單擊“創建函數導入”
  • 你現在可以在對像上下文中為你的函數命名並定義它返回的內容 - 在這種情況下,選擇你新創建的實體類型(例如上面的DepartmentDataEntityType
  • 你完成了!

你現在應該有一個函數導入類似於:

public global::System.Data.Objects.ObjectResult<DepartmentDataEntityType> GetPersonelInformationWithDepartmanID(global::System.String departmentName)
{
    global::System.Data.Objects.ObjectParameter departmentNameParameter;

    departmentNameParameter = new global::System.Data.Objects.ObjectParameter("departmentNameParameter", departmentName);

    return base.ExecuteFunction<DepartmentDataEntityType>("sp_GetDepartmanData", departmentNameParameter);
}

現在可以調用對像上下文中的此函數,以通過數據庫中的存儲過程檢索數據。

編輯:

如果您在執行此操作後收到映射錯誤(“錯誤3027:未為以下EntitySet / AssociationSet指定映射”),那是因為您創建的實體未映射到任何內容,並且僅在函數導入填充集合時使用這些實體您需要以某種方式將此實體映射到數據存儲,或者您需要將其更改為複雜類型。

要創建複雜類型,只需打開EF設計器並右鍵單擊空白區域。轉到添加>複雜類型。您應該會在模型瀏覽器中看到一個新的複雜類型。右鍵單擊它並添加類似於向實體添加屬性的標量屬性。然後刪除您的實體並重命名您的複雜類型與實體相同。

這就是你所要做的:)


熱門答案

你如何創建這個“概念實體”?如果我創建一個未映射到的實體,我會收到以下錯誤:“實體類型'foobar'未映射到數據庫。



許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因
許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因