2009-07-31 10 views
6

Czy ktoś może mi powiedzieć, czy/w jaki sposób można sprawdzić zmiany w kontekście danych w Linq2Sql przed wywołanie SubmitChanges(). Mam sytuację, w której tworzę kontekst, wykonuję wiele operacji i dodaje wiele wstawek wraz z innymi zadaniami przetwarzania, a następnie wycofuję, jeśli przesyłanie się nie powiedzie.Sprawdzanie poprawności Linq2Sql przed SubmitChanges()

Co wolę zrobić, to wykonać wywołanie "Validate()" po wykonaniu pewnych zadań, aby móc je obsłużyć przed przesłaniem całej pracy.

Odpowiedz

6

aby wszystkie zmiany w kontekście danych można nazwać

ChangeSet changes = dataContext.GetChangeSet(); 

// An IList<Object> 
changes.Deletes; 
changes.Inserts; 
changes.Updates; 

Co mam jest każdy przedmiot ma wartość metodę sprawdzenia poprawności. Używam attibutes do definiowania różnych rodzajów sprawdzania poprawności. Powodem, dla którego robię to ręcznie jest to, że mam numer, który może być int w bazie danych i kodzie, wartość 1002 może być nieważna, jeśli zapisuję wiek. Mogę podać zakres wartości itp. .

Jeśli każdy z twoich obiektów wartości dziedziczy po obiekcie bazowym, ułatwia ich iterowanie. Zakładając, że masz na swojej klasie podstawowej metodę sprawdzania poprawności.

Chciałbym podkreślić, że to zadziała, trzeba będzie albo edytować wygenerowany kod, albo przetasować własne obiekty wartości. Zwykle robię własne, ponieważ używam ich do sprawdzania poprawności.

+0

nie zauważył .GetChangeSet() metoda wcześniej! Dziękuję za to! +1 – StevenMcD

+0

Rzeczywistym podejściem, które zakończyłem, było stworzenie częściowej klasy z nazwą tabeli i wdrożenie kodu walidacyjnego w OnFooChanging() dla pól, które chciałem zweryfikować. To działa, aby wyrzucać wyjątki natychmiast po ustawieniu wartości zamiast w SubmitChanges(). Nie skorzystałem z ChangeSet, ale wskazało mi to we właściwym kierunku i mimo to jest przydatny. –

+0

@Nick - Czuję się bezużytecznie, mówiąc ci o tym, ponieważ nie pamiętam bloga, na którym czytam, ale najwyraźniej dobrym pomysłem jest utrzymanie sprawdzania poprawności oddzielnie od procedur obsługi "OnChange", ponieważ pozwala to na złożone scenariusze walidacji, gdzie walidacja jednej nieruchomości zależy od wartości innych itp. – Mark

5

Można również użyć funkcji OnValidate() z klasą części jednostki LINQ-to-SQL. OnValidate() zostanie wywołany podczas SubmitChanges(), ale zanim dane zostaną wysłane do bazy danych. Jedna dobra rzecz z OnValidate() polega na tym, że można rozróżnić działanie CRUD przez wyliczenie ChangeAction.

Na przykład

public partial class YourEntity 
{ 
    partial void OnValidate(System.Data.Linq.ChangeAction action) 
    { 
     if(action == System.Data.Linq.ChangeAction.Insert) 
      // Do insert 
     ... etc. ... 
    } 
} 
Powiązane problemy