代码:
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();
}
然后我得到了以下错误:
System.InvalidOperationException:'附加类型为'ENTITY NAME'的实体失败,因为同一类型的另一个实体已具有相同的主键值。
如果图中的任何实体具有冲突的键值,则使用“附加”方法或将实体的状态设置为“未更改”或“已修改”时,可能会发生这种情况。
这可能是因为某些实体是新的并且尚未收到数据库生成的键值。
在这种情况下,使用“添加”方法或“已添加”实体状态来跟踪图表,然后根据需要将非新实体的状态设置为“未更改”或“已修改”。
如果我删除AsNoTracking(),那么它可以正常工作。
但我真的需要AsNoTracking来避免无意中改变实体。