Linq to sql 在IQueryable上调用ToArray是否会在LinqToSql中附加实体?

Linq to sql 在IQueryable上调用ToArray是否会在LinqToSql中附加实体?,linq-to-sql,iqueryable.toarray,Linq To Sql,Iqueryable.toarray,我有一个LinqToSql查询,它返回一个项目对象数组,如下所示: return db.Articles.ToArray(); foreach (var item in array) db.articles.DeleteOnSubmit(item); 然后我循环这个数组,开始删除一些符合特定条件的项目,为了简单起见,假设我将它们全部删除,如下所示: return db.Articles.ToArray(); foreach (var item in array) db

我有一个LinqToSql查询,它返回一个项目对象数组,如下所示:

return db.Articles.ToArray();
foreach (var item in array) 
    db.articles.DeleteOnSubmit(item); 
然后我循环这个数组,开始删除一些符合特定条件的项目,为了简单起见,假设我将它们全部删除,如下所示:

return db.Articles.ToArray();
foreach (var item in array) 
    db.articles.DeleteOnSubmit(item); 
对DeleteOnSubmit(entity)的调用引发了一个无效的操作异常,它的消息显示“无法删除尚未附加的实体”。我修改了代码,首先获取实体,然后删除它,它工作得很好。以下是工作代码:

db.DeleteOnSubmit(db.Articles.Where(c=>c.Id == item.Id))
现在,我知道如果我修改了存储库以返回IQueryable而不是本机数组,它会起作用,我只是不明白为什么?ToArray是否与此无效操作异常有关
谢谢

ps:db是对DataContext对象的引用

我怀疑您在选择实体和提交更改时使用了不同的数据上下文。在这种情况下,如果返回的是
IQueryable
而不是本机
数组,则错误是自然的,并且仍然会发生。您可以
将一个实体附加到新的数据上下文中,或者在选择初始实体的位置使用相同的实体。

您可以将其全部放在一个方法中,然后再试一次吗

答案是“不”,不是


除非您使用的delete-than-select数据库不同(可能在您没有意识到的情况下发生),或者db.ObjectTrackingEnabled在某个地方被设置为false。

否,我只使用了一个DataContext!那样的话,我无法重现你的问题。。。我做了一个快速测试,我可以通过IQueryable或ToArrayReally删除Submit实体?我是说,哦!我将更新并添加带有所有代码的确切场景。Meligy:)你来了!不,我使用的是一个datacontext,我没有在代码中的任何地方接触ObjectTrackingEnabled,我假设默认情况下它设置为true。不管怎样,我会仔细检查一下,然后在这里向你们汇报。试着把你们所有的代码放在一个方法中,然后看看。如果问题仍然存在,请尝试发送完整的方法代码或(如果可能)简单的复制VS proj。