C# 尽管已将对象附加到上下文,但是否仍收到错误?无法删除尚未附加的实体
我已将对象附加到上下文,尽管我遇到了错误C# 尽管已将对象附加到上下文,但是否仍收到错误?无法删除尚未附加的实体,c#,linq,linq-to-sql,C#,Linq,Linq To Sql,我已将对象附加到上下文,尽管我遇到了错误无法删除尚未附加的实体。 if (itemRemove != -1) { //var deleteDetails = DBContext.ProductCustomizationMasters.Where(p => p.ProductID == this.ProductID && p.CustomCategoryID == catId && p.CustomType == (short)catTypeId).S
无法删除尚未附加的实体。
if (itemRemove != -1)
{
//var deleteDetails = DBContext.ProductCustomizationMasters.Where(p => p.ProductID == this.ProductID && p.CustomCategoryID == catId && p.CustomType == (short)catTypeId).Single();
var deleteDetails = DBContext.ProductCustomizationMasters.Single(p => p.ProductID == this.ProductID && p.CustomCategoryID == catId && p.CustomType == (short)catTypeId);
DBContext.ProductCustomizationMasters.Attach(deleteDetails);
DBContext.ProductCustomizationMasters.DeleteOnSubmit(deleteDetails);
RemoveCategoryItems(catId, catTypeId);
}
private void RemoveCategoryItems(int catId, CategoryType catTypeId)
{
switch (catTypeId)
{
case CategoryType.Topping:
(this.ToppingItems.Where(xx => xx.ToppingInfo.CatID == catId && xx.ProductID == this.ProductID).Single()).IsDefault = false;
FreeToppingItems.RemoveAll(x => x.ProductID == this.ProductID && x.ToppingInfo.CatID == catId);
break;
case CategoryType.Dressing:
(this.DressingItems.Where(xx => xx.DressingInfo.CatID == catId && xx.ProductID == this.ProductID).Single()).IsDefault = false;
FreeDressingItems.RemoveAll(x => x.ProductID == this.ProductID && x.DressingInfo.CatID == catId);
break;
case CategoryType.SpecialInstruction:
(this.InstructionItems.Where(xx => xx.InstructionInfo.CatID == catId && xx.ProductID == this.ProductID).Single()).IsDefault = false;
FreeInstructionItems.RemoveAll(x => x.ProductID == this.ProductID && x.InstructionInfo.CatID == catId);
break;
}
}
第一个想法-您不需要附加要删除的项目。该项已附加到上下文,并且状态正在管理中。只需跳过附加线并删除对象
编辑由于附加似乎不是您的问题,请尝试一下:
if (itemRemove != -1)
{
var deleteDetails = DBContext.ProductCustomizationMasters.Single(p => p.ProductID == this.ProductID && p.CustomCategoryID == catId && p.CustomType == (short)catTypeId);
//Obviously, this isn't going to work directly, you need to actually assign the ID, Primary Key Field here...
var deleteMe = new ProductCustomizationMasters() { PrimaryKey = deleteDetails.PrimaryKey };
DBContext.Attach(deleteMe);
DBContext.DeleteOnSubmit(deleteMe);
DBContext.SubmitChanges();
RemoveCategoryItems(catId, catTypeId);
}
再次编辑-您发布的代码似乎不是问题的根源。此代码之外的某些内容正在设置要从上下文中删除的对象,但尚未附加ant。我建议您重新检查代码,检查对“DeleteOnSubmit”的所有引用,并确保在标记这些实体时已附加这些实体。您使用的查询提供程序是什么?为什么要附加这些实体?它已连接,因为您从未分离它?错误被抛出到哪里?在此方法或
RemoveCategoryItems
方法中?您不需要附加通过服务检索的实体,是在DeleteOnSubmit()
上还是在调用DBContext.SaveChanges()
时引发的错误。您还使用LINQ访问什么(SQL、SQLCE、ODATA等?),因为每个的实现略有不同。此时DBContext.ProductCustomizationMasters.DeleteOnSubmit(deleteDetails)抛出错误;尝试在调用DeletOnSubmit
之后立即使用delete,至少现在是这样,看看它是否有效。如果是这样(它应该这样做),那么这将告诉您,您的问题在于其他地方的其他代码。也许你正在删除同一批中完全不同位置的另一个项目,这是你实际问题的根源。如果删除它,那么我也会犯同样的错误,这就是为什么我这样处理它。@NearroToDotnet他从来没有说过你应该分离它,他说你不应该附加它;两者都不做。是的,我跳过了//DBContext.ProductCustomizationMasters.Attach(deleteDetails)这一行;但是我遇到了相同的错误,无法删除尚未附加的实体。如果仍然出现该错误,您可能会开始查看RemoveCategoryItems代码。你能在原始问题中发布代码吗?好的,但这对集合有效。我把它放在问题中,我想它甚至不符合那种方法。。