Database operation expected to affect 1 row(s) but actually affected 0 row(s).解决方案

SELECT changes();
引发的异常:“Microsoft.EntityFrameworkCore.DbUpdateConcurrencyException”(位于 Microsoft.EntityFrameworkCore.dll 中)
“Microsoft.EntityFrameworkCore.DbUpdateConcurrencyException”类型的异常在 Microsoft.EntityFrameworkCore.dll 中发生,但未在用户代码中进行处理
Database operation expected to affect 1 row(s) but actually affected 0 row(s). Data may have been modified or deleted since entities were loaded. See http://go.microsoft.com/fwlink/?LinkId=527962 for information on understanding and handling optimistic concurrency exceptions.

报了这个错,官方说是并发引起,就我自己,哪来并发?网上的其他答案也没解决我的问题。

最后我偶然解决了这个问题,作为引发此异常的原因之一,记录一下,帮助有需要的人。

我的数据库实体类定义了构造函数,然后没有声明默认构造函数,导致EF创建实体失败,导致了此异常。

解决方案:

在你自定义构造函数后面补充个默认构造函数

    public class KeyValue
    {
        [Key]
        public string Key { get; set; }
        public string Value { get; set; }
        public string Type { get; set; }

        public KeyValue(string key, string value, string type)
        {
            Key = type + ":" + key;
            Value = value;
            Type = type;
        }

        public KeyValue()
        { }
    }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论
这个错误通常是由于乐观并发性冲突引起的。乐观并发性是一种处理并发访问数据库的策略,它假定多个用户之间的冲突是罕见的,并且只在提交更改时检查数据是否已被其他用户修改。当一个用户试图提交更改时,如果该数据已被其他用户修改,则会引发乐观并发性异常。 在你的情况下,错误信息表明你预期影响一行数据,但实际上没有影响任何行。这可能是因为在你加载实体(数据)后,其他用户已经修改或删除了这些数据。 为了解决这个问题,你可以考虑以下几个步骤: 1. 确保你在修改数据之前重新加载了最新的数据。这可以通过重新查询数据库获取最新的数据,或者使用一些 ORM(对象关系映射)工具来自动管理数据加载。 2. 在提交更改之前,检查数据是否已被其他用户修改。可以通过比较你加载的数据与当前数据库中的数据来实现。如果数据不匹配,可以选择放弃更改、重新加载最新数据或者手动解决冲突。 3. 如果你的应用程序中经常出现乐观并发性异常,你可能需要重新评估你的并发控制策略。你可以考虑使用悲观并发性控制策略,这意味着在修改数据之前,先锁定数据以防止其他用户对其进行修改。这样可以避免冲突,但可能会对性能产生一定的影响。 希望这些建议能帮助你解决问题!如果还有其他问题,请随时提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

上海好程序员

给上海好程序员加个鸡腿!!!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值