【问题标题】:How to run a stored procedure with Entity Framework?如何使用实体框架运行存储过程?
【发布时间】:2015-05-20 17:33:38
【问题描述】:

我不知道如何使用 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 关键字不支持“元数据”

谢谢大家。

【问题讨论】:

  • 亲爱的,我想通过 Connection string 使用 SQLcommand 运行存储过程,然后将数据结果绑定到 DataTable 。
  • 你不能。 EntityFramework 以不同的方式执行此操作。您要么放弃 EntityFramework 要求(并修复您的连接字符串),要么按照其他地方描述的 EntityFramework 方式进行。有很多例子
  • “你有没有想过这个 stackoverflow.com/questions/10898344/” - 那么 EF 是一个 ORM 并混合了一个 带有 adhoc SQL-in-code 的 ORM 模型 可以说是代码异味,并且可能违背任何好的 ORM 的目的。通过 EF 设计器封装存储过程要好得多

标签: c# entity-framework stored-procedures


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

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

    this._db 是您的数据上下文。

    那就这样称呼吧;

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

    【讨论】:

      【解决方案3】:

      当你的模型从数据库中生成时,你可以像这样直接调用存储过程:

      DbContextObject.YourStoredProcedureName(parameters)
      

      另一种选择是,

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

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

      希望这会有所帮助..!

      【讨论】:

        【解决方案4】:

        嗯,我找到了答案。

         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);    
            }
        

        你可以试试,给我一些问题。谢谢各位。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2013-12-25
          • 2013-10-31
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-12-28
          • 2015-06-05
          • 1970-01-01
          相关资源
          最近更新 更多