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

How to map user defined table valued function to EF 6 database first entity collection?

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

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

假设 table 用户只有这两列(int 和 nvarchar)。出于显而易见的原因,我跳过了此过程中的任何逻辑。它现在只是 returns 来自 table 用户的所有行和列。

我已将 table 用户映射为实体用户,并且可以从 dbcontext 访问。现在我希望它作为 IQueryable 从该过程中返回。我特别不想使用 "Complex" 类型 的结果集,而是原始实体 User.

当我执行函数导入并将 "Returns collection of" 设置为 entities - User 时,它不起作用,抛出异常。

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

    [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");

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

"Entities" 确实是我的 dbcontext class 的正确名称。

我的功能是否有误,或者可以做些什么来使这个场景起作用?

非常感谢

唯一的问题是 entity framework 的错误,它显然无法使用与 "Entities" 不同的 name/type 连接字符串(它是默认的 ADO.NET 模型创造)。我很早以前就修改过T4模板。直到我想打电话给 UDF 我从来没有遇到任何问题。它使用不同的名称和类型的连接字符串,我在多个库中共享这些连接字符串,但并非所有库都支持这种奇怪的连接字符串类型,如下所示:

connectionString="metadata=res:///DataModel.csdl|res:///DataModel.ssdl|res://*/..." one.

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

    ...
}   

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