【问题标题】:Use stored procedure with parameters in Entity Framework在实体框架中使用带参数的存储过程
【发布时间】:2016-03-11 17:19:32
【问题描述】:

我使用的是 Entity Framework 6.1.3,并使用了数据库优先的方法来让它生成模型文件和.EDMX。我在 SQL Server 2008 R2 上也有以下存储过程,实体框架将其引入 EDMX:

CREATE PROCEDURE [dbo].[FindEmployee] 
    @LastName nvarchar(50), 
    @employeeID nvarchar(50),
    @securityID nvarchar(50)
AS
BEGIN
    SET NOCOUNT ON;

    select * 
    from Employee
    where 
        (lastName = dbo.trim(@LastName) AND dbo.trim(@LastName) IS NOT NULL)
        OR  (employeeID = dbo.trim(@employeeID) AND dbo.trim(@employeeID) IS NOT NULL)
        OR  (securityID = dbo.trim(@securityID) AND dbo.trim(@securityID) IS NOT NULL)
    order by
        case when dbo.trim(@LastName) is not null then CONVERT(char(50), lastName) + CONVERT(char(50), firstName) 
                when dbo.trim(@employeeID) is not null then employeeID 
                when dbo.trim(@securityID) is not null then securityID
            end
END

在 Windows WPF 应用程序中,我让用户从组合框中选择要搜索的列(lastNameemployeeIDsecurityID)。用户提供一个搜索值,该值将插入到存储过程调用中的该参数中。然后存储过程从它的SELECT 返回一个结果集,我将使用它来填充DataGrid

我正在尝试调用这段代码中的存储过程;请注意,FindEmployee_Result 是 EDMX 中为存储过程自动生成的类:

public FindEmployee_Result SearchEmployees(string lastName, string employeeID, string securityID)
{
    var results = new FindEmployee_Result();

    using (var ctx = new TestSelectionEntities())
    {
        results = ctx.FindEmployee(lastName,employeeID,securityID);
    }

    return results;
}

此代码因此错误而崩溃:

无法将类型“System.Data.Entity.Core.Objects.ObjectResult”隐式转换为“TestSelection.data.FindEmployee_Result”

我错过了什么?谢谢。

【问题讨论】:

  • 是否返回Employee类型的记录?
  • 我认为它正在返回 Employee 类型的记录。
  • 我不确定,但我认为您需要将存储过程作为函数导入。看看这个帖子:stackoverflow.com/questions/32140774/…
  • 谢谢,@S.Akbari。奇怪的是,当我最初运行实体框架工具时,它会将存储过程拉入我的TestSelection.edmx。所以它就在那里,但是你如何调用它并使用它的结果呢?
  • 想通了...存储过程返回一个列表,因此我需要将其更改为使用List<FindEmployee_Result>

标签: c# sql-server wpf entity-framework stored-procedures


【解决方案1】:

解决方案是使用List,因为存储过程返回FindEmployee_Result 对象的结果集:

public List<FindEmployee_Result> SearchEmployees(string lastName, string employeeID, string securityID)
{
    using (var ctx = new TestSelectionEntities())
    {
        return ctx.FindEmployee(lastName,employeeID,securityID).ToList();
    }
}

【讨论】:

  • 你会把它放在控制器还是模型中?顺便说一句...这非常有帮助:) +1
  • @jellz77,很高兴代码有帮助!创建位于 EF 模型之上的数据访问层/服务。然后您的控制器调用此数据服务以通过存储过程获取数据;然后将数据交给视图。数据服务只是一个包含上述方法的类;控制器调用它并获得List。稍后,如果您的数据库更改为其他内容,则不必更改您的控制器。推荐的方法是拥有一个由控制器调用的逻辑层;逻辑层调用数据服务。
猜你喜欢
  • 1970-01-01
  • 2022-01-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-30
  • 2014-01-25
相关资源
最近更新 更多