如何在ADO.NET实体框架中使用存储过程

6

我有三张表;我在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();

我从SQL中编写了GetPersonelInformationWithDepartmanID函数(在ADO.NET实体框架中定义的用户定义函数),这里有3个备选项(这很愚蠢!!!),但是我有3个连接表!!!。如果我先连接3个表,我该怎么使用它?

3个回答

6

好的,您需要完成以下步骤:

  • 将存储过程sp_GetDepartmanData添加到您的Entity Framework模型中 (顺便说一下 - 强烈建议不要使用sp_(something)来命名您的存储过程 - 使用sp_前缀是保留给Microsoft系统存储过程的)
  • 由于您的存储过程返回一组数据,因此您需要先为其创建一个概念实体,然后才能使用存储过程;在Entity Designer中,创建一个新实体并称其为一些有用的名称,例如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设计器,右键单击空白区域。 转到添加>复杂类型。 您应该在模型浏览器中看到一个新的复杂类型。 右键单击它,并添加标量属性,类似于添加属性到实体的方式。 然后删除实体并将复杂类型重命名为实体相同的名称。
这就是您需要做的 :)

嗨,马克。我尝试按照你的指示在这里操作,但是当我使用POCO设置时无法使其工作。如果我允许设计师创建我的类,则可以正常工作。您知道如何使用POCO进行此操作吗? - Pure.Krome
@Pure.Krome:不好意思,我还没有真正使用过EF4 POCO,所以我不能确切地说... - marc_s
这个可以工作,但是我在错误列表中得到了一个持久的错误,它说“错误3027:以下EntitySet/AssociationSet没有指定映射”。我需要做什么来解决这个错误? - Chev
1
我找到了问题所在。您不能创建未映射的实体,而应该创建一个复杂类型。我会更新这个答案并提供相关信息。 - Chev

1

如何创建这个“概念实体”? 如果我创建一个未映射到数据库的实体,将会出现以下错误:“实体类型 'foobar' 未映射到数据库。”


我也遇到了这个错误...据我所知,这是一个1.0的bug,他们打算在3月份发布4.0时才解决。https://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=378518&wa=wsignin1.0 - Kyle
糟糕:( 我正在使用VS2010,但我仍然遇到了这个问题..即使MS Connect说这个错误已经“修复”。WTF :( qq :( - Pure.Krome


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接