如何在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合法吗? 是的,了解原因