【问题标题】:Inserts using EF's RawSQL are not returning IDENTITY使用 EF Raw SQL 插入不返回 IDENTITY
【发布时间】:2014-10-09 15:05:55
【问题描述】:

给定:

在最初的帖子中,我试图拨打db.Database.ExecuteCommand,从那时起我将其更改为您在此处看到的内容。 (哪个有效)。执行命令总是返回0xfffff。 SQLQuery 返回最后一个 select 语句的值或插入的行,具体取决于您的编码方式。

using (db=new MyEntites())
{
    var inserted = db.Database.SqlQuery<decimal>(query,parms}
}

查询的最后两行是:

SET NOCOUNT OFF  
Select SCOPE_IDENTITY() AS newID  

【问题讨论】:

  • 如果你的最后一行只是RETURN SCOPE_IDENTITY(),它是否有效?
  • 把它放在查询字符串或.NET代码中?我在 .NET 中找不到对 SCOPE_IDENTITY 的引用
  • 看看我的回答,应该会有帮助。

标签: sql-server entity-framework rawsql


【解决方案1】:

ExecuteSqlCommand 方法的文档中,返回值为

执行命令后数据库返回的结果。

这意味着您需要RETURN 过程中的值,而不是结果集。因此,在您的存储过程中作为最后一个命令执行此操作:

RETURN SCOPE_IDENTITY()

【讨论】:

  • 我没有使用存储过程,而是编写直接查询。
  • 设置无计数;插入 dbo.SomeTable (field1,field2,field3) 值 (@fields1,@field2,@field3);选择 SCOPE_IDENTITY();设置 NOCOUNT 关闭;
  • 如果您没有使用存储过程(也许如果您使用了,内存现在让我失望了)ExecuteSqlCommand 的返回值是受影响的行数,而不是结果集。您可能需要考虑改用SqlQuery&lt;&gt;
  • 这在 SQL 中直接工作 SET NOCOUNT ON; INSERT INTO dbo.Table (field) VALUES ('test');选择 SCOPE_IDENTITY() 作为 TESTID;设置 NOCOUNT 关闭;但不是在 EF 中使用 commandm 我会尝试其他方法,但我认为命令方法是 Inserts 所需要的
【解决方案2】:

感谢您的建议,第 1 步将这样的内容作为最后一次选择放入查询字符串中:

Select SCOPE_IDENTITY() as TESTID;

然后使用这种 EF 形式的 SQLQuery,十进制类型就是上面选择示例返回的类型。

using (db=new MyEntites())
{
   var identity = db.Database.SqlQuery<decimal>(query,parms}
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-11-26
    • 2021-12-29
    • 1970-01-01
    • 1970-01-01
    • 2011-02-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多