2009-06-21 118 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的’未映射到数据库