0

DataContextオブジェクトと Linq to SQL を c# で使用しています。ウィッシュリストのウィッシュに対する投票を、最初の質問が重複していると管理者が判断した質問に移そうとしています。ただし、voteテーブルには主キーとしてWishIdandがあるUserIdため、ユーザーが宛先の希望にすでに投票している場合、挿入は失敗します。私がやりたいのは、これらのケースを無視して (vote挿入する前にテーブルをクエリせずに)、すべての有効な投票を挿入することです。これが私がやりたいことです。

using (linqWishesDataContext dataContext = new linqWishesDataContext())
{
    try
    {
        dataContext.WishlistUpvotes.InsertAllOnSubmit(destinationVotes);
        dataContext.SubmitChanges(ConflictMode.ContinueOnConflict);
    }
    catch{}
}

私が今持っている1つの解決策は、これを行うことです:

foreach (WishlistUpvote vote in destinationVotes)
{
    using (linqWishesDataContext dataContext = new linqWishesDataContext())
    {
        try
        {
            dataContext.WishlistUpvotes.InsertOnSubmit(vote);
            dataContext.SubmitChanges();
        }
        catch { }
    }
}

しかし、移動する必要がある数百または数千の投票がある場合、DataContext投票ごとに新しいものを作成するのは悪い考えのようです。助言がありますか?

4

1 に答える 1

1

DataContext毎回新しいものを作成する必要はありません。同じものを再利用できます。そうでない場合は、今と同じように呼び出しをループするだけです。

using (linqWishesDataContext dataContext = new linqWishesDataContext())
{
    foreach (WishlistUpvote vote in destinationVotes)
    {
        try
        {
            dataContext.WishlistUpvotes.InsertOnSubmit(vote);
            dataContext.SubmitChanges();
        }
        catch { }
    }
}

もちろん、これにより、更新ごとに個別のコマンドが発行されます。(ただし、ADO.NET 接続プールは引き続きバックグラウンドで動作するため、それほど恐ろしいことではありません) 挿入用の SQL を手動で作成しないと、他に何ができるかわかりません。データ コンテキストはSubmitChanges()、トランザクション内の 1 回の呼び出しに対してすべての変更を行います。これが、「オール オア ナッシング」動作を取得する理由です。

于 2012-11-28T23:26:32.043 に答える