0

私は単純な linq to sql オブジェクトを持っています。データベースから取得し、フィールドを変更して保存します。

更新された行はありません。:(

ネットワーク経由で送信された完全な Sql コードを確認すると、主キーを介してではなく、where 句を介してすべてのフィールドで行が更新されていることがわかります。これは正常ですか?各フィールドの where'ing (それは :P という単語です) の代わりに、主キーにリンクする where 句を使用してフィールドを更新するのは簡単だと思いました。

これがコードです...

using (MyDatabase db = new MyDatabase())
{
    var boardPost = (from bp in db.BoardPosts
        where bp.BoardPostId == boardPostId
        select bp).SingleOrDefault();

    if (boardPost != null &&
        boardPost.BoardPostId > 0)
    {
        boardPost.ListId = listId; // This changes the value from 0 to 'x'
        db.SubmitChanges();
    }
}

ここにいくつかのサンプルSQLがあります..

exec sp_executesql N'UPDATE [dbo].[BoardPost]
SET [ListId] = @p6
WHERE ([BoardPostId] = @p0) AND .... <snip the other fields>',N'@p0 int,@p1 int,@p2 nvarchar(9),@p3 nvarchar(10),@p4 int,@p5 datetime,@p6 int',@p0=1276,@p1=212787,@p2=N'ttreterte',@p3=N'ttreterte3',@p4=1,@p5='2009-09-25 12:32:12.7200000',@p6=72

今、私はこの更新に日時フィールドがあることを知っています..そして私がDBをチェックしたとき、その値は「2009-09-25 12:32:12.720」でした/です(上記よりゼロが少ない)..だから私はそうではありませんそれがwhere句の条件を台無しにしているかどうかを確認してください...

それでも!PK の where 句を実行する必要があります..どちらかといえば..スピードのために!

はい・いいえ ?


アップデート

nitzmahon の返信を読んだ後、いくつかの値で楽観的な同時実行性をいじってみましたが、それでもうまくいきませんでした :(

それで、私はいくつかの新しいことを始めました...オプティミスティック同時実行が発生すると、更新しようとしているフィールドにwhere句が含まれます。そうなると、うまくいきません。

だから..上記のSQLでは、where句は次のようになります...

WHERE ([BoardPostId] = @p0) AND ([ListId] IS NULL) AND ... <rest snipped>)

これは正しく聞こえません。更新を行う前に、DB の値は null です。しかし、ListId の値を where 句に追加すると (または、L2S がオプトミスティックな同時実行性のためにそれを追加した場合)、行の検索/一致に失敗します。

なんだ?

4

3 に答える 3

3

where句は正常です-理由がわからない場合は、Googleの「楽観的並行性」です。dbml デザイナーですべてのフィールドを「UpdateCheck:Never」に設定することで、この動作をオプトアウトできます (ただし、そうすることで重要な安全性チェックを放棄していることを理解してください)。

更新が失敗するという事実は、DBML と DB の間でデータ型またはソース値が一致していないことが原因である可能性があります (同期が取れなくなるのは簡単です。この種のことのために DBML を DB と比較するためのサードパーティ ツールがあります)。テストするには、SSMS でキャプチャした更新ステートメントを実行してみますが、「1 行が影響を受ける」まで where 句から値を削除します。機能したら、問題のある列が見つかりました。

于 2009-09-25T03:07:41.320 に答える
0

これを前に置いてみるsubmitchanges()

_tdIssuesLog.Refresh(System.Data.Linq.RefreshMode.KeepCurrentValues, issueslog);
于 2010-03-24T18:11:39.240 に答える
0

あなたが説明している動作は、データベースと Linq to SQL オブジェクトが同期していないことを示唆しています。Linq to SQL クラス デザイナーからクラスを削除して保存し、テーブルをデータベース エクスプローラーからデザイナーにドラッグして戻し、もう一度保存してください。これにより、更新の問題が解決されるはずです。

于 2009-09-25T03:12:11.807 に答える