gpt4 book ai didi

c# - 无法跟踪实体类型 'xTestType' 的实例,因为已跟踪具有相同键的该类型的另一个实例?

转载 作者:行者123 更新时间:2023-11-30 13:35:42 26 4
gpt4 key购买 nike

我正在尝试从表格中删除多行。但它在第一次迭代后给出了以下错误。我可以在所有 xTestType 对象上看到主键 Id0。这可能是问题所在。为什么总是给 Id 0.

foreach (var temp in oldxDetails.TestTypes)
{
if (deleteTestTypes.Contains(input.Id))
{
var xTestType = new xTestType
{
xId = xId,
TestTypeMasterId = temp.Id
};

await _xTestRepository.DeleteAsync(xTestType);
}
}

异常:

无法跟踪实体类型“xTestType”的实例,因为已跟踪具有相同键的该类型的另一个实例。添加新实体时,对于大多数键类型,如果未设置键(即如果键属性被分配为其类型的默认值),将创建一个唯一的临时键值。如果您为新实体明确设置键值,请确保它们不会与现有实体或为其他新实体生成的临时值发生冲突。附加现有实体时,确保只有一个具有给定键值的实体实例附加到上下文。

最佳答案

当您从数据库中获取数据并对其进行迭代时,例如:

var dataObject = await dbContext.Table.where(x=>x.UserId == model.UserId).TolistAsync();
foreach(var item in dataObject)
{

}

不要创建另一个对象,将获取的对象直接传递给 Delete 或使用它来更新,因为 DbContext 正在跟踪它获取的对象,而不是您创建的对象。例如:

//Wrong code
var dataObject = await dbContext.Table.where(x=>x.UserId == model.UserId).TolistAsync();
foreach(var item in dataObject)
{
var x=new DataObject()
{
x=item.Id
};
dbContext.Table.Remove(x);
}

您必须将最初获取的实例传递给 Remove() 方法,请参阅:

var dataObject = await dbContext.Table.where(x=>x.UserId == model.UserId).TolistAsync();
foreach(var item in dataObject)
{
dbContext.Table.Remove(item);
}

关于c# - 无法跟踪实体类型 'xTestType' 的实例,因为已跟踪具有相同键的该类型的另一个实例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46712370/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com