C# EF:';附加类型为'的实体;实体名称';失败,因为相同类型的另一个实体已具有相同的主键值

C# EF:';附加类型为'的实体;实体名称';失败,因为相同类型的另一个实体已具有相同的主键值,c#,.net,entity-framework,C#,.net,Entity Framework,代码: public void test2() { var id=newint[]{39,40,41}; var founds=\u db.db\u MODEL.AsNoTracking()。其中(x=>ids.Contains(x.ID)).ToArray(); 创建。重复(x=> { x、 IsDefault=false; _db.Set().Add(x); _db.Entry(x).State=System.Data.Entity.EntityState.Modified; }); var

代码:

public void test2()
{
var id=newint[]{39,40,41};
var founds=\u db.db\u MODEL.AsNoTracking()。其中(x=>ids.Contains(x.ID)).ToArray();
创建。重复(x=>
{
x、 IsDefault=false;
_db.Set().Add(x);
_db.Entry(x).State=System.Data.Entity.EntityState.Modified;
});
var target=\u db.db\u MODEL.AsNoTracking().FirstOrDefault(x=>x.ID==41);
target.IsDefault=true;
_db.Set().Add(目标);
_db.Entry(target.State=System.Data.Entity.EntityState.Modified;
_db.SaveChanges();
}
然后我得到了以下错误:

System.InvalidOperationException:'附加类型为'entity NAME'的实体失败,因为相同类型的另一个实体已具有相同的主键值

如果图形中的任何实体具有冲突的键值,则在使用“Attach”方法或将实体状态设置为“Unchanged”或“Modified”时可能会发生这种情况

这可能是因为某些实体是新的,尚未收到数据库生成的键值

在这种情况下,使用“添加”方法或“添加”实体状态跟踪图形,然后根据需要将非新实体的状态设置为“未更改”或“已修改”

如果我删除AsNoTracking(),那么它会工作


但我确实需要进行跟踪,以避免无意中更改实体。

如果您希望EF跟踪实体实例(因此,当您再次获得相同的实体时,在本例中为41),则需要跟踪。请详细说明(在问题中)您为什么认为您可能会更改不想更改的对象?可能重复1。表的主键是什么?2.他们不是通过AsNoTracking获取数据,而是将其添加到数据库中,这是没有意义的。为什么不在启用跟踪的情况下获取并更改require属性而不设置兴奋性状态对于Id 41,我想它有效吗?第二次尝试添加ID为41的相同实体时。是第二次添加(目标)给出错误的行?如果没有,请说明。
 public void test2()
    {
        var ids = new int[] { 39, 40, 41 };
        var founds = _db.DB_MODEL.AsNoTracking().Where(x => ids.Contains(x.ID)).ToArray();
        founds.Repeat(x =>
        {
            x.IsDefault = false;
            _db.Set<QuoteEntity>().Add(x);
            _db.Entry(x).State = System.Data.Entity.EntityState.Modified;
        });


        var target = _db.DB_MODEL.AsNoTracking().FirstOrDefault(x => x.ID == 41);
        target.IsDefault = true;
        _db.Set<QuoteEntity>().Add(target);
        _db.Entry(target).State = System.Data.Entity.EntityState.Modified;


        _db.SaveChanges();
    }