如何在EF7 beta8中执行存储过程?

时间:2015-11-18 13:43:25

标签: asp.net entity-framework stored-procedures

我正在尝试在EF7 beta8中运行存储过程以返回特定数据。我试图通过FromSQL命令来做,但不确定这是否是正确的命令。

strSQL = wt.DataSource.StoredProc;

foreach (var p in prms)
{
    strSQL = strSQL + " @" + p.Name + " = '" + p.Value + "',";
}
strSQL = strSQL.Remove(strSQL.Length - 1); //removes last comma

var test = _dbContext.Widgets.FromSql("EXEC " + strSQL).ToList();

var test2 = _dbContext.Widgets.FromSql("SELECT * FROM Widgets").ToList();

如果测试2正常工作并正确返回数据,则test1返回错误:

  

'FromSql'操作的结果中没有所需的列'Id'。

我假设我返回的数据不是模型的一部分。如果是这种情况,我如何执行存储过程并将原始数据返回到List或DataTable?

修改

我正在尝试使用SQLCommand:

var connection = (SqlConnection)_dbContext.Database.GetDbConnection();
var command = connection.CreateCommand();
command.CommandType = CommandType.StoredProcedure;
command.CommandText = strSQL;
foreach(var p in prms)
{
    command.Parameters.Add("@" + p.Name, p.Value);
}
connection.Open();
var test = command.ExecuteNonQuery();
connection.Close();

公共汽车仍然没有运气:

  

从对象类型Newtonsoft.Json.Linq.JValue到已知的托管提供程序本机类型不存在映射。

有没有其他方法可以在不映射实体的情况下执行存储过程?

1 个答案:

答案 0 :(得分:1)

您应该能够使用普通SqlCommandExecuteReader方法从存储过程中获取数据。

快速样本。

此代码执行名为GetWidgets的存储过程,该过程需要2个参数@name@categoryId,并返回包含2列IdName的结果集。我们正在从DataReader读取值并创建一个WidgetDto对象并附加到WidgetDto列表。

你的WidgetDto是一个简单的POCO

public class WidgetDto
{
  public int Id {set;get;}
  public string Name {set;get;}
}

执行存储过程的代码是

private List<WidgetDto> GetWidgets(d)
{
    var catId= 1;
    var name ="test"
    //The above values are hard coded for demo. you may replace it 
    // with whatever your stored proc is expecting.

    var list = new List<WidgetDto>();

    const string sqlQry = "exec GetWidgets @name,@categoryId";
    using (var db = new StudentsEntities())
    {
        using (var con = (SqlConnection) db.Database.Connection)
        {
            using (var cmd = new SqlCommand(sqlQry, con))
            {    
                cmd.Parameters.AddWithValue("@name", name);
                cmd.Parameters.AddWithValue("@categoryId", catId);

                con.Open();
                using (var reader = cmd.ExecuteReader())
                {

                    while (reader.Read())
                    {
                        var s = new GoodVm();
                        s.Id = reader.GetInt32(reader.GetOrdinal("Id"));
                        s.Name = reader.GetString(reader.GetOrdinal("Name"));

                        list.Add(s);
                    }
                }
            }
        }
    }
    return list;
}

在这个例子中,我使用我的DbContext的db.DataBase.Connection(在ED 6.13版本中可用)属性来构建连接。您也可以使用连接字符串从传统方式构建连接。