Przechodziłem przez debugger w jakimś kodzie bazy danych strony i zakończyłem wykonywanie przed zmianami bazy danych. Ale wciąż były zapisane w bazie danych!Blokowanie USINGa zachowuje się inaczej na stronie internetowej niż na windowsie z formularza
Próbowałem odtworzyć problem za pomocą aplikacji Windows Form i nie zapisałem danych w bazie danych (oczekiwane zachowanie). Wróciłem do strony internetowej i to zrobił.
Oto prosta przykładowa strona. Używam tego w internetowej miejscu czy to robi różnicę:
<%@ 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>
kończę wykonanie (Przesunięcie + F5) przy zerwaniu, przed drugi druku debug lub SubmitChanges()
zostanie wykonany . "Linia 2" to nie wyjście do okna debugowania, ale zmieniono bazę danych na.
Uruchamianie tego samego testu w formularzu systemu Windows zachowuje się tak samo.
Czy cykl życia strony lub zarządzanie sesją w jakiś sposób tu przeszkadza? Jak to jest możliwe, Linia 2 nie zostanie wydrukowana!
Czy otrzymujesz błąd/wyjątek na formularzu okna, jak to działa? – raidensan
@raidensan Przebiorę to. Nie zachowuje się tak samo. Nie zapisuje zmiany w bazie danych (jak się spodziewałem, nie powinna, biorąc pod uwagę, że przerwano przed wywołaniem "Prześlij"). – Ian
Wykonaj polecenie "throw new Exception()" zamiast "Debug.WriteLine (" Line 2 ")" w swoim przykładzie i zobacz, jak to działa. – Evk