如何将用户定义的表值函数映射到EF 6数据库第一个实体集合?

时间:2017-11-16 14:06:23

标签: c# sql-server entity-framework entity-framework-6 user-defined-functions

我正在尝试解决在UDF执行上映射原始实体的问题。 我有这种情况:

    CREATE FUNCTION [dbo].[GetUsers]
    (
        @password nvarchar(50) NULL
    )
    RETURNS TABLE 
    AS
    RETURN 
    (
     SELECT UserID, Username FROM User
    )

假设表用户只有那两列(int和nvarchar)。由于显而易见的原因,我跳过了这个过程中的任何逻辑。它现在只返回表User的所有行和列。

我已将表User映射为实体User,可从dbcontext访问。现在我希望它从IQueryable这个过程返回。我特别不想使用" Complex"的结果集。输入,但输入原始实体用户

当我执行函数import并设置"返回"的集合时实体 - 用户,它不工作,抛出异常。

它在dbcontext类中生成的代码如下所示:

    [DbFunction("Entities", "GetUsers")]
    public virtual IQueryable<User> GetUsers(string password)
    {
        var passwordParameter = password != null ?
            new ObjectParameter("password", password) :
            new ObjectParameter("password", typeof(string));

        return ((IObjectContextAdapter)this).ObjectContext.CreateQuery<User>("[Entities].[GetUsers](@password)", passwordParameter);
    }

所以当我使用:

调用函数时
   var result = dbcontext.GetUsers("pass");

它抛出异常:&#39; Entities.GetUsers&#39;无法解析为有效的类型或函数。近成员访问表达式,第1行,第11列。

&#34;实体&#34;确实是我的dbcontext类的正确名称。

我的功能是否有问题或者可以采取哪些措施使这种情况有效?

非常感谢

1 个答案:

答案 0 :(得分:0)

唯一的问题在于实体框架的错误,它显然不能使用不同的名称/类型的连接字符串而不是“实体”(它是ADO.NET模型创建的默认框架)。很久以前我修改了T4模板。直到我想打电话给UDF,我从来没有遇到任何问题。它使用了不同的名称和类型的连接字符串,我在多个库中共享它们并不是所有它都支持奇怪类型的连接字符串,如下所示:

  

的connectionString = “元数据= RES:// /DataModel.csdl|res:// /DataModel.ssdl | RES:// * / ...”   之一。

public partial class Entities : DbContext
{
    public Entities() : base("name=Entities")
    {
    }

    ...
}   

当我像上面那样回来时,它开始工作了。