私は単純な 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 がオプトミスティックな同時実行性のためにそれを追加した場合)、行の検索/一致に失敗します。
なんだ?