簡體   English   中英

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

[英]How to use a stored procedure in ADO.NET Entity Framework

我有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 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM