Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/274.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 数据库操作预期影响1行,但实际影响50行(db序列下一个数字)_C#_Asp.net Core_Entity Framework Core_Database Concurrency - Fatal编程技术网

C# 数据库操作预期影响1行,但实际影响50行(db序列下一个数字)

C# 数据库操作预期影响1行,但实际影响50行(db序列下一个数字),c#,asp.net-core,entity-framework-core,database-concurrency,C#,Asp.net Core,Entity Framework Core,Database Concurrency,我使用实体框架2.2.6。我有AddOrUpdate方法。当客户端尝试对实体进行操作(插入或更新)时,我通过唯一值检查db上是否存在实体,并将旧数据id值设置为新数据id值,然后将其设置为已更新。如果不存在,我将其设置为insert public void AddOrUpdate(TEntity entity, Expression<Func<TEntity, bool>> predicate) { var oldEntity =

我使用实体框架2.2.6。我有
AddOrUpdate
方法。当客户端尝试对实体进行操作(插入或更新)时,我通过唯一值检查db上是否存在实体,并将旧数据id值设置为新数据id值,然后将其设置为已更新。如果不存在,我将其设置为insert

public void AddOrUpdate(TEntity entity, Expression<Func<TEntity, bool>> predicate)
        {
            var oldEntity = Get(predicate);
            DetachEntry(oldEntity);

            if (oldEntity != null)
            {
                var idProperty = entity.GetType().GetProperties().First(x => x.Name == "Id");
                idProperty.SetValue(entity, idProperty.GetValue(oldEntity, null));

                Update(entity);
            }
            else
                Add(entity);
        }
public void AddOrUpdate(TEntity实体、表达式谓词)
{
var oldEntity=Get(谓词);
拆离条目(旧实体);
if(oldEntity!=null)
{
var idProperty=entity.GetType().GetProperties().First(x=>x.Name==“Id”);
SetValue(实体,idProperty.GetValue(oldEntity,null));
更新(实体);
}
其他的
添加(实体);
}
当我尝试使用简单实体时,效果很好。但当我使用非常复杂的类型时,我会得到以下异常

数据库操作预期会影响1行,但实际受影响 50排。自实体被删除后,数据可能已被修改或删除 加载。寻找 关于理解和处理乐观并发的信息 例外情况

我的复杂类型是这样的

public class FamilyMemberInfo 
    {

        public int Id { get; set; }

        public int AppealId { get; set; }

        public int MemberId { get; set; }

        public FamilyMember FamilyMember { get; set; }

        public Appeal Appeal { get; set; }

        public ICollection<FamilyMemberContact> Contacts { get; set; }

        public ICollection<FamilyMemberCrime> Crimes { get; set; }

        public ICollection<FamilyMemberDisease> Diseases { get; set; }

        public ICollection<FamilyMemberPaymentLiability> PaymentLiabilities { get; set; }


    }
公共类FamilyMemberInfo
{
公共int Id{get;set;}
公共int appalid{get;set;}
public int MemberId{get;set;}
公共家庭成员家庭成员{get;set;}
公众上诉{get;set;}
公共ICollection联系人{get;set;}
公共ICollection犯罪{get;set;}
公共ICollection疾病{get;set;}
公共ICollection PaymentResponsibilities{get;set;}
}
调用
AddOrUpdate
方法后,我看
ChangeTraker
一切似乎都很好。它生成了非常好的查询

我找不到例外的原因。我在stakoverflow上看到了家族性错误。但每一次孤独都不适合我

编辑


当我对两个子实体(哪些子实体并不重要)进行注释时,everythink工作正常

通常为了避免并发问题,您会向表中添加一个rowversion列。您可以将其与行数据的其余部分一起检索。你把它放在身边,通常从不向用户展示。然后在写回更改以查看行版本是否被其他人更改时,作为最后一次检查。你知道,在主键和其他一切之后。听起来您试图实现自己的客户端版本的rowversion,但失败了。您甚至影响了1行以上的内容,这清楚地表明查询没有包含pimary键。或者你的主键真的出了问题,导致了重复。或者,您可能试图写入一个完全错误的表,该表使用所述ID作为外键。“这是肯定的,在查询级别出现了严重的混乱。@Christopher我在conficuration类中设置了所有主键。如果你需要回答,我可以发布所有的答案them@Christopher除了我之外,没有人可以更改数据库上的数据。数据库表的主键是什么?名字不是主键,因为许多人都有相同的名字。您的查询使用名字,然后使用名字更改表中的所有人。您的查询应该使用筛选器的唯一限定符,以便您只更改一个人而不是多个人。