EntityFrameWork和TableValued参数

ssi*_*777 11 stored-procedures entity-framework bulkinsert table-valued-parameters

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

但是当我尝试进行功能导入时,我不断收到一条警告信息 -

函数"InsertPerson"在参数索引0处具有参数"InsertPerson_TVP",其具有数据类型"表类型",目前.NET Framework版本当前不支持该类型.该功能被排除在外.

我在这里进行了一次初步搜索,发现很少有帖子说在EntityFrameWork中有可能有一些解决方法,很少有人说它在当前版本中不受支持.

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

ssi*_*777 18

我最后这样做了,请注意我们正在研究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();
        }
Run Code Online (Sandbox Code Playgroud)

我的表值参数(UDT表)脚本如下所示:

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

我的商店程序就像开始一样

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

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

希望它有所帮助.


小智 5

也许我们也可以考虑使用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;
}
Run Code Online (Sandbox Code Playgroud)