通过Entity Framework如何使用C#调用SQL Server用户定义函数

3
我不敢相信我要问这个问题,但我被卡住了。我刚花了三个小时试图解决这个问题,但我被卡住了。
我以前在C#的一个旧版本中能够做到这一点,但现在我卡住了。
在继续之前,这是我正在使用的堆栈...
- Visual Studio 2012 - SQL Server 2012 - .NET Framework 3.5(我已经尝试了不同版本并得到了相同的结果)。
请考虑以下SQL代码:
create table dbo.customers
(
    customerid int not null identity(1,1), 
    fname varchar(50), 
    lname varchar(50), 
    favfruit varchar(30)
)
go

alter table customers 
   add constraint customers_customerid_pk primary key (customerid)

insert into customers(Fname, lname, favfruit) 
values ('Melissa', 'Smith', 'Apple'),
       ('Jennifer', 'Jones', 'Pear'),
       ('Jill', 'Brown', 'Apple')       

create function dbo.fngetfruit(@customerid int)
returns varchar(30)
as
begin
    declare @favfruit varchar(30)

    select @favfruit = favfruit
    from dbo.customers c (nolock)
    where c.customerid = @customerid

    return @favfruit
end

select dbo.fngetfruit(2)

这段代码创建了一个名为customers的表和一个名为fngetfruit的用户定义函数。该函数接受customerid并从customer表中返回该客户的最喜爱的水果。

到目前为止,一切正常,一切运作良好。

现在我想要使用Entity Framework从C#控制台应用程序调用我的函数(fngetfruit)。

创建一个新的控制台应用程序。

从解决方案资源管理器中,右键单击应用程序名称。选择“添加” ==> “新项目” ==> “ADO.NET Entity Data Model”。

我将.edmx文件命名为CustomersEF。

选择生成自数据库。设置您的连接。我采用了默认实体连接名称为 customersEntities。单击下一步。

在“选择您的数据库对象和设置”屏幕上,选择customers表和fngetfruit函数。单击完成。

接下来,您将进入显示数据库图表的屏幕。在我的情况下,我只有一个名为customer的单个表。无法找到该函数。

打开控制台应用程序的主要函数。

以下代码有效...

var cusDb = new customersEntities();

var custable = cusDb.customers;

然而,以下代码无法正常工作...
var cusDb = new customersEntities();

var favfruit = cusDb.fngetfruit(1);

为什么我无法访问我的函数?我缺少了什么?就像我所说的,在早期版本中,上述步骤对我起作用。

谢谢。


用以前版本的 c#?我觉得这极难相信。 - Camilo Terevinto
你可能需要将其作为函数导入吗?这里有个参考链接 https://dev59.com/0FwY5IYBdhLWcg3w2K3c#32359095 - Salah Akbari
1
稍作停顿...在您继续到处使用NOLOCK提示之前,您可能需要阅读这篇文章。http://blogs.sqlsentry.com/aaronbertrand/bad-habits-nolock-everywhere/ - Sean Lange
@CamiloTerevinto 当我第一次学习Entity Frameworks的基础时,用户定义的函数就可以正常工作。现在似乎需要额外的步骤了。 - codingguy3000
那是Entity Framework的旧版本。C#是一种语言,而不是一个框架。 - Camilo Terevinto
显示剩余2条评论
1个回答

6

这是一个标量值用户定义函数。EF从未直接支持这些函数。向DBContext添加一个方法以调用标量值用户定义函数非常简单。可以像下面这样:

public string GetFruit(int customerId)
{
    return Database.SqlQuery<string>("select dbo.fngetfruit(@customerId) fruit", new System.Data.SqlClient.SqlParameter("@customerID", customerId)).Single();
}

自EF5版本(需要.NET 4x)起,EF支持表值用户定义函数。 Entity Framework Table-Valued Functions (TVFs) (EF5 onwards)


也许我正在使用支持标量值用户定义函数的Linq-to-SQL。 - codingguy3000
这里的 Database 是从哪里来的,它是什么? - SpyderScript
为您的 DBContext 添加一个方法,即 DbContext 的 Database 属性。https://learn.microsoft.com/en-us/dotnet/api/system.data.entity.dbcontext.database?view=entity-framework-6.2.0 - David Browne - Microsoft

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