【问题标题】:How to use a stored procedure in ADO.NET Entity Framework如何在 ADO.NET Entity Framework 中使用存储过程
【发布时间】:2009-06-21 17:05:55
【问题描述】:

我有 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 个表,我该如何使用?

【问题讨论】:

    标签: c# .net linq entity-framework


    【解决方案1】:

    好的,这里需要几个步骤:

    • 将您的存储过程sp_GetDepartmanData 添加到您的实体框架模型中 (顺便说一句 - 强烈建议调用您的存储过程 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 设计器并右键单击空白区域。转到添加 > 复杂类型。您应该会在模型浏览器中看到一个新的复杂类型。右键单击它并添加标量属性,类似于您向实体添加属性的方式。然后删除您的实体并将您的复杂类型重命名为与实体相同。

    这就是你所要做的:)

    【讨论】:

    • 嗨,马克。我试着按照你的指示,在这里..当我有 POCO 设置时,我无法让它工作。如果我允许设计师创建我的类,那么这将起作用。你知道如何用 POCO'S 做到这一点吗?
    • @Pure.Krome:不,抱歉,我还没有真正对 EF4 POCO 做过任何事情,所以我真的不能说......
    • 这可行,但我在错误列表中收到一个持续错误,显示“错误 3027:没有为以下 EntitySet/AssociationSet 指定映射”。我需要做什么来解决这个错误?
    • 我发现了问题所在。您不能创建未映射的实体。而是创建一个复杂类型。我会用这些信息更新这个答案。
    【解决方案2】:

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

    【讨论】:

    • 我也遇到了这个错误......据我所知,这是一个 1.0 的错误,他们不打算在 3 月份发布 4.0 之前修复。 connect.microsoft.com/VisualStudio/feedback/…
    • 无赖 :( 我正在使用 VS2010,但我仍然遇到这个问题 .. 即使 MS Connect 说该错误已“修复”。WTF :( qq :(
    【解决方案3】:
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多