2009-06-21 97 views
6

我有3個表格;我在ADO.NET實體框架中編寫了一個存儲過程。如何在ADO.NET實體框架中使用存儲過程

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 

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

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

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

GetPersonelInformationWithDepartmanID函數I從SQL(在ADO.NET實體框架的用戶定義的函數)有3個選擇(寫是愚蠢的!!!),但我有3 joininig表!我如何使用如果我加入3表之前?

回答

6

好吧,你需要幾個步驟在這裏:

  • 添加您的存儲過程sp_GetDepartmanData你的實體框架模型 (順便說一句 - 這是強烈建議調用存儲過程sp_(something) - 使用sp_前綴保留給僅用於Microsoft系統存儲過程)
  • 由於您的存儲過程正在返回一組數據,因此您需要先爲它創建一個概念實體,然後才能ca n使用你的存儲過程;在實體設計器中,創建一個新實體並將其稱爲一些有用的名稱,如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設計器並右鍵單擊一個空白區域。轉到添加>複雜類型。您應該會看到模型瀏覽器中出現一個新的複雜類型。右鍵單擊它並添加標量屬性,類似於將屬性添加到實體的方式。然後刪除您的實體並將您的複雜類型重命名爲與實體相同。

這就是你需要做的:)

+0

馬克你好。我嘗試按照你的指示,在這裏..當我有一個POCO設置時,我不能工作如果我允許設計師創建我的課程,那麼這個工程就可以工作了你知道如何用POCO'S做到這一點嗎 – 2010-08-02 06:40:41

+0

@ Pure.Krome:不,對不起,我對EF4 POCO沒有真正做過任何事情,所以我不能說真的...... – 2010-08-02 15:06:05

1

如何創建這個「概念實體」? 如果我創建未映射到我得到以下錯誤的實體:「實體類型‘foobar的’未映射到數據庫