編集:何かがある可能性がある場合に備え、同じ種類のdatacontextを作成して処理するコードをアクションハンドラが呼び出しますこの動作でコードはMatchUpdateQueueテーブルには触れませんが、私はそれをちょうど言及する必要があります。DeleteOnSubmit LINQ例外 "既に使用中のキーを持つエンティティを追加できません"
ダブル編集:誰もが正解でした!私は質問のほとんどを受けた回答者に答えを出しました。問題を修正すると、別の問題(ハンドラ内に隠されていた)がポップアップすることが許されました。まったく同じ例外がスローされました。うわー!
LINQでアイテムを削除する際に問題が発生します。以下のコードのDeleteOnSubmit呼び出しは、 "既に使用されているキーを持つエンティティを追加できません"というメッセージとともにLINQ例外を発生させます。私はここで何が間違っているのか分からず、壁の上に私を運転し始めている。主キーは整数の自動インクリメントの列であり、データベースキューからアイテムを削除しようとするまでは他の問題はありません。うまくいけば、私はここで痛みを伴い、私でない人のために見つけやすい何かをやっている!
static void Pacman()
{
Queue<MatchUpdateQueue> waiting = new Queue<MatchUpdateQueue>();
events.WriteEntry("matchqueue worker thread started");
while (!stop)
{
if (waiting.Count == 0)
{
/* grab any new items available */
aDataContext db = new aDataContext();
List<MatchUpdateQueue> freshitems = db.MatchUpdateQueues.OrderBy(item => item.id).ToList();
foreach (MatchUpdateQueue item in freshitems)
waiting.Enqueue(item);
db.Dispose();
}
else
{
/* grab & dispatch waiting item */
MatchUpdateQueue item = waiting.Peek();
try
{
int result = ActionHandler.Handle(item);
if (result == -1)
events.WriteEntry("unknown command consumed : " + item.actiontype.ToString(), EventLogEntryType.Error);
/* remove item from queue */
waiting.Dequeue();
/* remove item from database */
aDataContext db = new aDataContext();
db.MatchUpdateQueues.DeleteOnSubmit(db.MatchUpdateQueues.Single(i => i == item));
db.SubmitChanges();
db.Dispose();
}
catch (Exception ex)
{
events.WriteEntry("exception while handling item : " + ex.Message, EventLogEntryType.Error);
stop = true;
}
}
/* to avoid hammering database when there's nothing to do */
if (waiting.Count == 0)
Thread.Sleep(TimeSpan.FromSeconds(10));
}
events.WriteEntry("matchqueue worker thread halted");
}
私は持っていた デシベル。MatchUpdateQueues.DeleteOnSubmit(db.MatchUpdateQueues.FirstOrDefault(x => x.id == item.id)); しかし、それは同じ例外を投げたので、私は同じエラーを与える最も簡単なコードに戻りました。 –
私が提供したコードを試してみて、それが例外をスローすると、あなたは例外を投稿できますか? –
コード: db.MatchUpdateQueues.DeleteOnSubmit(db.MatchUpdateQueues.Single(x => x == item)); 例外: 処理中の例外:すでに使用されているキーを持つエンティティを追加できません。 –