代码之家  ›  专栏  ›  技术社区  ›  codingguy3000

C#通过实体框架调用SQL Server用户定义函数

  •  3
  • codingguy3000  · 技术社区  · 8 年前

    我不敢相信我不得不问这个问题,但我被卡住了。我花了三个小时想弄明白这一点,但我被困住了。

    我在以前版本的C中能够做到这一点,但alias我被卡住了。

    在我继续之前,这里是我正在处理的堆栈。。。

    • 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表中返回该客户最喜欢的水果。

    到现在为止,一直都还不错。一切正常。

    现在,我想使用实体框架从C#控制台应用程序调用我的函数(fngetfruit)。

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

    从解决方案资源管理器的控制台应用程序内部,右键单击应用程序名称。选择添加==>新建项目==>ADO。NET实体数据模型。

    我将我的命名为。edmx文件CustomersEF。

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

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

    接下来,您将进入一个显示数据库关系图的屏幕。在我的例子中,只有一个名为customer的表。该函数在哪里都找不到。

    打开控制台应用程序的主要功能。

    以下代码有效。。。

    var cusDb = new customersEntities();
    
    var custable = cusDb.customers;
    

    但是,以下代码不起作用。。

    var cusDb = new customersEntities();
    
    var favfruit = cusDb.fngetfruit(1);
    

    为什么我不能访问我的功能?我错过了什么?正如我所说,上述步骤在早期版本中对我有效。

    谢谢

    1 回复  |  直到 8 年前
        1
  •  5
  •   David Browne - Microsoft    8 年前

    这是一个标量值的用户定义函数。EF从未直接支持过这些。向DBContext中添加一个方法来调用标量值UDF很简单。类似于:

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

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