EF Core 2使用OUTPUT参数执行存储过程

时间:2018-03-02 21:52:14

标签: c# entity-framework-core

为什么不返回输出值?

使用EF Core 2(2.1.0-preview-final)作为通过代码优先建模管理模式的平台,我想添加其他数据库对象,如SP。这本身就是一个旅程,但是主题下的挑战是使用context.Database.ExecuteSqlCommandAsync()执行SP并检索OUTPUT参数值。

这是成功执行SP的代码,但永远不会返回输出值。你会认为设置参数的方向就足够了。

public async Task AddAsync(Models.Filename entity)
{
    SqlParameter name = new SqlParameter("@Name", entity.Name);
    SqlParameter idOut = new SqlParameter
    {
        ParameterName = "@Id",
        SqlDbType = System.Data.SqlDbType.BigInt,
        Direction = System.Data.ParameterDirection.Output
    };
    using (var db = new MetaDataDbContext())
    {
        await db.Database.ExecuteSqlCommandAsync("[dbo].[AddFilename] @Name, @Id", name, idOut);
    }
    entity.Id = Convert.ToInt64(idOut.Value);
}

1 个答案:

答案 0 :(得分:3)

解决问题所需的只是将T-SQL语句更改为"[dbo].[AddFilename] @Name, @Id OUTPUT"

EF6 - ExecuteSqlCommandAsync - Get return parameter (declare scalar variable error)看起来很有希望然而它错过了一个关键部分,即T-SQL部分必须包含目标参数的OUTPUT关键字。

Why does EF Core always return -1 with this stored procedure?,事后看来提供了解决方案,但是我的搜索结果中没有出现它的名称(标题)。

HTH!