如何使用Entity Framework运行存储过程?

时间:2015-05-20 01:51:44

标签: c# entity-framework stored-procedures

我不知道如何使用Entity Framework运行存储过程。我试过了:

public static string GetGroupModFunc(string group_mod_id)
{
    SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["QLNTEntities"].ToString());
    conn.Open();

    SqlCommand cmd = new SqlCommand("GET_GROUP_PERMIT", conn);
    cmd.CommandType = CommandType.StoredProcedure;
    cmd.Parameters.AddWithValue("@GID", group_mod_id);

    SqlDataAdapter da = new SqlDataAdapter(cmd);
    DataTable dt = new DataTable();
    da.Fill(dt);

    conn.Close();
    return "Test connection";
}

我的连接字符串实体客户端

<add name="QLNTEntities" 
     connectionString="metadata=res://*/DATA.ModelQLNT.csdl|res://*/DATA.ModelQLNT.ssdl|res://*/DATA.ModelQLNT.msl;provider=System.Data.SqlClient;provider connection string=&quot;data source=.\SQLEXPRESS;initial catalog=QLNT;integrated security=True;MultipleActiveResultSets=True;App=EntityFramework&quot;"  
     providerName="System.Data.EntityClient" />

运行后我收到错误

  

不支持System.ArgumentException关键字&#39;元数据&#39;

谢谢你们。

4 个答案:

答案 0 :(得分:2)

enter image description here

在您的edmx文件中,打开模型浏览器,然后选择Add Function Import,EF将相应地为您的存储过程生成正确的代码和模型。

答案 1 :(得分:1)

首先使用代码,我从存储库中使用以下方法;

public async Task<int> Query(string query, params object[] parameters)
{
    return await this._db.Database.ExecuteSqlCommandAsync(query, parameters);
}

this._db是你的datacontext。

然后这样称呼它;

string query = "exec <StoredProcName> @Param1, @Param2";
Task<int> a = this._repository.Query(query,
                    new SqlParameter("@Param1", "foo"),
                    new SqlParameter("@Param2", "bar"));

答案 2 :(得分:0)

从数据库生成模型时,您可以直接调用存储过程,如下所示:

DbContextObject.YourStoredProcedureName(parameters)

另一种选择是,

Db.ExecuteFunction("Stored Procedure Name", "Parameter Collection");

其中Db是数据库上下文对象。

希望这会有所帮助..!

答案 3 :(得分:-2)

好吧,我找到了答案。

 public static string GetGroupModFunc(string group_mod_id)
    {
        var sconnect = ((SqlConnection)db.Database.Connection);
        sconnect.Open();
        SqlCommand cmd = new SqlCommand("GET_GROUP_PERMIT", sconnect);
        cmd.CommandType = CommandType.StoredProcedure;
        cmd.Parameters.AddWithValue("@GID", group_mod_id);
        SqlDataAdapter da = new SqlDataAdapter(cmd);
        DataTable dt = new DataTable();
        da.Fill(dt);
        sconnect.Close();
   //It's flexible , because it's return DataTable , not entity , You can use avery where 
   // ok the result bind to datatable .I'll convert them to JSON
        List<Dictionary<string, object>> rows = new List<Dictionary<string, object>>();
        Dictionary<string, object> row;
        foreach (DataRow dr in dt.Rows)
        {
            row = new Dictionary<string, object>();
            foreach (DataColumn col in dt.Columns)
            {
                row.Add(col.ColumnName, dr[col]);
            }
            rows.Add(row);
        }
        return JsonConvert.SerializeObject(rows);    
    }

你可以尝试一下,并给我一些问题。谢谢你们。