私は一部のウェブサイトのデータベースコードでデバッガをステップ実行し、データベースの変更が適用される前に実行を終了しました。しかし、彼らはまだデータベースに書かれていました!USINGブロックはウェブサイトとウィンドウの動作が異なります
Windowsフォームアプリケーションを使用して問題を再現しようとしましたが、データベースに書き込まれませんでした(予期した動作)。私はウェブサイトに戻り、はでした。
ここには簡単な例のページがあります。
<%@ Page Language="C#" %>
<%@ Import Namespace="System.Diagnostics" %>
<!DOCTYPE html>
<script runat="server">
protected void Page_Load(object sender, EventArgs e)
{
using (MsSqlDataContextDataContext db = new MsSqlDataContextDataContext())
{
Product product = db.Products.First(p => p.id == 21);
Debug.WriteLine("Line 1");
// I learnt the hard way that if you try to update the database with the value
// that already exists, it seems to get optimised away.
// The update must a new value.
product.Type = "bogus" + DateTime.UtcNow.Ticks;
Debug.WriteLine("Line 2"); // <- Breakpoint here
db.SubmitChanges();
}
}
</script>
<html>
<head runat="server">
</head>
</html>
私は前二デバッグプリントやSubmitChanges()
を実行します、ブレークポイントで(Shiftキー + F5)実行を終了:私はそれが違いを行う場合のウェブサイトでこれを実行しています。 "行2"はで、デバッグウィンドウに出力されないですが、データベースの変更はです。です。
Windowsフォームで同じテストを実行すると同じ動作をします。
ページのライフサイクル、またはセッション管理が何らかの理由でここに干渉していませんか?これはどのように可能なのですか、2行目は印刷されません!
Windowsフォームでエラー/例外が発生しましたが、どのように機能しませんか? – raidensan
@raidensan私はそれに言い換えるつもりです。それは同じように振る舞いません。データベースに変更を書き込まない(私が 'Submit'呼び出しの前に打ち切ったとすると、私は期待しなかった)。 – Ian
あなたの例では "Debug.WriteLine(" Line 2 ")"の代わりに "Exception()"を投げ、それがどうなるかを見てください。 – Evk