【问题标题】:EntityFrameWork and TableValued Parameter实体框架和表值参数
【发布时间】:2012-11-16 02:02:54
【问题描述】:

我正在尝试从使用 Table-value 参数的 EntityFramework 调用存储过程。

但是当我尝试执行函数导入时,我不断收到一条警告消息说 -

函数“InsertPerson”有一个参数“InsertPerson_TVP”在 具有数据类型“表类型”的参数索引 0 当前为 目标 .NET Framework 版本不支持。该功能是 排除在外。

我在这里进行了初步搜索,发现很少有帖子说它可以在 EntityFrameWork 中通过一些变通方法和few 说它在当前版本中不受支持。

有没有人知道解决这个问题的更好方法或解决方案?

【问题讨论】:

  • EF 不支持 TVP。如果您找到了解决方法,请尝试一下,或者不要使用 EF 通过 TVP 调用存储过程。

标签: entity-framework stored-procedures bulkinsert table-valued-parameters


【解决方案1】:

我最终这样做了,请注意我们正在处理 EF DataContext(不是 ObjectContext

使用输出参数执行存储过程

       using (DataContext context = new DataContext())
        {                  
          ////Create table value parameter
          DataTable dt = new DataTable();
          dt.Columns.Add("Displayname");
          dt.Columns.Add("FirstName");
          dt.Columns.Add("LastName");
          dt.Columns.Add("TimeStamp");

          DataRow dr = dt.NewRow();
          dr["Displayname"] = "DisplayName";
          dr["FirstName"] = "FirstName";
          dr["LastName"] ="LastName";
          dr["TimeStamp"] = "TimeStamp";             
          dt.Rows.Add(dr);

          ////Use DbType.Structured for TVP
          var userdetails = new SqlParameter("UserDetails", SqlDbType.Structured);
          userdetails.Value = dt;
          userdetails.TypeName = "UserType";

          ////Parameter for SP output
          var result = new SqlParameter("ResultList", SqlDbType.NVarChar, 4000);
          result.Direction = ParameterDirection.Output;

          context.Database.ExecuteSqlCommand("EXEC UserImport @UserDetails, @ResultList OUTPUT", userdetails, result);

          return result == null ? string.Empty : result.Value.ToString();
        }

我的 Table-Value-Parameter(UDT 表)脚本如下所示:

CREATE TYPE [dbo].[UserType] AS TABLE (
    [DisplayName]      NVARCHAR (256)   NULL,
    [FirstName]        NVARCHAR (256)   NULL,
    [LastName]         NVARCHAR (256)   NULL,
    [TimeStamp]        DATETIME         NULL
   )

我的存储过程开始像

CREATE PROCEDURE UserImport 
-- Add the parameters for the stored procedure here
@UserDetails UserType Readonly,
@ResultList NVARCHAR(MAX) output  
AS

对于没有 output 参数的存储过程,我们不需要添加/传递给 SP 的任何输出参数。

希望对某人有所帮助。

【讨论】:

  • dr的实例化在哪里?由于 DataRowBuilder 的保护级别,我遇到了错误。
  • 你的函数不是 UDT(用户定义类型)而不是 UDF(用户定义函数)吗?
  • 是的,TVP 是用户定义的类型。
【解决方案2】:

或许我们也可以考虑SqlQuery方法:

[Invoke]
public SomeResultType GetResult(List<int> someIdList)
{
    var idTbl = new DataTable();
    idTbl.Columns.Add("Some_ID");

    someIdList.ForEach(id => idTbl.Rows.Add(id));

    var idParam = new SqlParamter("SomeParamName", SqlDbType.Structured);
    idParam.TypeName = "SomeTBVType";
    idParam.Value = idTbl;

    // Return type will be IEnumerable<T>
    var result = DbContext.Database.SqlQuery<SomeResultType>("EXEC SomeSPName, @SomeParamName", idParam);

    // We can enumerate the result...

    var enu = result.GetEnumerator();
    if (!enu.MoveNext()) return null;
    return enu.Current;
}

【讨论】:

    【解决方案3】:
                var detailTbl = new DataTable();
            detailTbl.Columns.Add("DetailID");
            detailTbl.Columns.Add("Qty");
            txnDetails.ForEach(detail => detailTbl.Rows.Add(detail.DetailID, detail.Qty));
    
            var userIdParam = new System.Data.SqlClient.SqlParameter("@UserID", SqlDbType.Int);
            userIdParam.Value = 1;
    
            var detailParam = new System.Data.SqlClient.SqlParameter("@Details", SqlDbType.Structured);
            detailParam.TypeName = "DetailUpdate";
            detailParam.Value = detailTbl;
    
            var txnTypeParam = new System.Data.SqlClient.SqlParameter("@TransactionType", SqlDbType.VarChar);
            txnTypeParam.Value = txnType;
    
            var result = await db.Database.ExecuteSqlCommandAsync("MySP @UserID, @Details, @TransactionType", userIdParam, detailParam, txnTypeParam);
            if(result >= 0)
                return StatusCode(HttpStatusCode.OK);
            else
                return StatusCode(HttpStatusCode.InternalServerError);
    

    【讨论】:

      猜你喜欢
      • 2013-08-29
      • 2011-12-30
      • 2013-10-14
      • 2011-02-19
      • 1970-01-01
      • 2011-08-17
      • 1970-01-01
      相关资源
      最近更新 更多