【问题标题】:SaveChangesAsync not working inside PUT methodSaveChangesAsync 在 PUT 方法中不起作用
【发布时间】:2020-09-09 12:18:29
【问题描述】:

我正在使用 ODataController 将条目插入和更新到数据库 我正在使用 PUT 方法,使用 .UpdateEntryAsync()

这是我的 Put 方法。

public async Task<IHttpActionResult> Put([FromODataUri] string key, Delta<KYCBtnDetails> patch)
        {
            try
            {
                if (!ModelState.IsValid)
                {
                    return BadRequest(ModelState);
                }

                KYCBtnDetails KYCBtnDetails = await _KYCDBModel.KYCBtnDetails.FindAsync(key);
                if (KYCBtnDetails == null)
                {
                    return NotFound();
                }

                patch.Put(KYCBtnDetails);
                KYCBtnDetails.id = key;

                try
                {
                    await _KYCDBModel.SaveChangesAsync();
                }
                catch (Exception e)
                {

                }

                return Updated(KYCBtnDetails);
            }
            catch (Exception ex)
            {

            }
            return null;
        }

在 await _KYCDBModel.SaveChangesAsync() 上它给了我错误 “不允许新建事务,因为会话中有其他线程在运行” “在提供程序连接上启动事务时发生错误。有关详细信息,请参阅内部异常。”

有时运行有时报错

请帮助我, 谢谢。

【问题讨论】:

  • 请分享minimal reproducible example。简短回答 - _KYCDBModel 可能注册错误。
  • 看起来问题寻求更多细节
  • 99.99% 这是因为在多个请求之间共享_KYCDBModel
  • 同意丹尼斯的观点

标签: c# odata put


【解决方案1】:

按照惯例,Put 控制器操作签名应如下所示:

public async Task<IHttpActionResult> Put([FromODataUri] string key, [FromBody]KYCBtnDetails kycBtnDetails)
{
    // ...
}

如果您决定使用Patch,控制器操作签名应如下所示:

public async Task<IHttpActionResult> Patch([FromODataUri] string key, [FromBody]Delta<KYCBtnDetails> patch)
{
    // ...
}

注意FromBody属性

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-09-07
    • 1970-01-01
    • 1970-01-01
    • 2019-05-01
    • 2011-03-23
    • 2015-02-08
    • 1970-01-01
    • 2014-05-27
    相关资源
    最近更新 更多