从EntityFramework执行存储过程 - 代码优先

时间:2014-01-08 14:39:24

标签: c# linq linq-to-sql entity-framework-4 linq-to-entities

我有一个SQL存储过程(SP) uspGetLocationsforUser ,我正在试用我的MVC项目。

我首先通过将此代码添加到Context Class(DAL)将其映射到EntityFramework中:

public virtual ObjectResult<uspGetLocationsforUser_Result> uspGetLocationsforUser(string userName)
{
    var userNameParameter = userName != null ?
        new ObjectParameter("UserName", userName) :
        new ObjectParameter("UserName", typeof(string));

    return ((IObjectContextAdapter)this).ObjectContext.ExecuteFunction<uspGetLocationsforUser_Result>("uspGetLocationsforUser", userNameParameter);
}

此类已添加到模型中,以表示SP的返回结果:

public class uspGetLocationsforUser_Result
{
    public int LocationID { get; set; }
    public string LocationName { get; set; }
}

我想从代码中调用它,由于某种原因,这不起作用:

我正在尝试这样做:

using (var data = new DAL())
{
List<uspGetLocationsforUser_Result> results = data.uspGetLocationsforUser(userName).ToList(); 
}
你可以帮忙吗?

提前致谢。

更新

这是错误消息:

“在容器'DAL'中找不到FunctionImport'uspGetLocationsforUser'。”

1 个答案:

答案 0 :(得分:0)

解决方法是我必须添加存储过程所属的SQL模式名称。

然后执行此操作:

var userName = GetUserWindowsLoginName();

SqlParameter logonName = new SqlParameter("@userName", userName);

List<uspGetLocationsforUser_Result> results = data.Database.SqlQuery<uspGetLocationsforUser_Result>("admin.uspGetLocationsforUser @userName", logonName).ToList();