我有3张桌子;我在 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
我需要一个存储过程函数,我在下面编写:
var staffPersonel = staffContext.GetPersonelInformationWithDepartmanID("Yazılım");
gvPersonel.DataSource = staffPersonel;
gvPersonel.DataBind();
我从 SQL 编写的 GetPersonelInformationWithDepartmanID 函数(ADO.NET 实体框架中的用户定义函数)有 3 个替代方案(这很愚蠢!!!),但我有 3 个连接表!!!。如果我之前加入了3张桌子,我该如何使用?
好的,您需要执行以下几个步骤:
- 添加您的存储过程
sp_GetDepartmanData
到您的实体框架模型
(顺便说一句 - 这是strongly推荐NOT调用您的存储过程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);
}
现在可以调用对象上下文上的此函数,以通过存储过程从数据库检索数据。
Marc
Edit:
如果执行此操作后出现映射错误(“错误 3027:没有为以下 EntitySet/AssociationSet 指定映射”),这是因为您创建的实体未映射到任何内容,并且仅在函数导入填充集合时使用这些实体。您要么需要以某种方式将该实体映射到数据存储,要么需要将其更改为复杂类型。
要创建复杂类型,只需打开 EF 设计器并右键单击空白区域即可。转到添加 > 复杂类型。您应该会看到模型浏览器中出现一个新的复杂类型。右键单击它并添加标量属性,类似于向实体添加属性的方式。然后删除您的实体并将复杂类型重命名为与实体相同的名称。
这就是你所要做的:)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)