Przewodnik: dostosowywanie zachowania wstawiania, aktualizowania i usuwania klas jednostek
Uwaga
Zestawy danych i powiązane klasy to starsze technologie .NET Framework z początku 2000 roku, które umożliwiają aplikacjom pracę z danymi w pamięci, gdy aplikacje są odłączone od bazy danych. Technologie te są szczególnie przydatne w przypadku aplikacji, które umożliwiają użytkownikom modyfikowanie danych i utrwalanie zmian z powrotem w bazie danych. Mimo że zestawy danych okazały się bardzo udaną technologią, zalecamy, aby nowe aplikacje platformy .NET używały platformy Entity Framework Core. Program Entity Framework zapewnia bardziej naturalny sposób pracy z danymi tabelarycznymi jako modelami obiektów i ma prostszy interfejs programowania.
Narzędzia LINQ to SQL w programie Visual Studio udostępnia wizualną powierzchnię projektową służącą do tworzenia i edytowania klas LINQ to SQL (klas jednostek) opartych na obiektach w bazie danych. Korzystając z linQ to SQL, można użyć technologii LINQ do uzyskiwania dostępu do baz danych SQL. Aby uzyskać więcej informacji, zobacz LINQ (Zapytanie zintegrowane w języku).
Domyślnie logika do wykonywania aktualizacji jest dostarczana przez środowisko uruchomieniowe LINQ to SQL. Środowisko uruchomieniowe tworzy domyślne Insert
instrukcje , Update
i Delete
na podstawie schematu tabeli (definicje kolumn i podstawowe informacje o kluczu). Jeśli nie chcesz używać domyślnego zachowania, możesz skonfigurować zachowanie aktualizacji i wyznaczyć określone procedury składowane do wykonywania niezbędnych wstawiania, aktualizacji i usuwania wymaganych do pracy z danymi w bazie danych. Można to również zrobić, gdy domyślne zachowanie nie jest generowane, na przykład gdy klasy jednostek są mapowane na widoki. Ponadto można zastąpić domyślne zachowanie aktualizacji, gdy baza danych wymaga dostępu do tabeli za pomocą procedur składowanych. Aby uzyskać więcej informacji, zobacz Dostosowywanie operacji przy użyciu procedur składowanych.
Uwaga
Ten przewodnik wymaga dostępności procedur składowanych InsertCustomer, UpdateCustomer i DeleteCustomer dla bazy danych Northwind.
Ten przewodnik zawiera kroki, które należy wykonać, aby zastąpić domyślne zachowanie czasu wykonywania LINQ to SQL na potrzeby zapisywania danych z powrotem do bazy danych przy użyciu procedur składowanych.
W tym przewodniku dowiesz się, jak wykonywać następujące zadania:
Utwórz nową aplikację windows Forms i dodaj do niej plik LINQ to SQL.
Utwórz klasę jednostki zamapowana na tabelę Northwind
Customers
.Utwórz źródło danych obiektu, które odwołuje się do klasy LINQ to SQL
Customer
.Utwórz formularz systemu Windows zawierający element DataGridView powiązany z klasą
Customer
.Zaimplementuj funkcję zapisywania formularza.
Utwórz DataContext metody, dodając procedury składowane do projektanta O/R.
Skonfiguruj klasę
Customer
tak, aby korzystała z procedur składowanych w celu wykonywania operacji wstawiania, aktualizacji i usuwania.
Wymagania wstępne
W tym przewodniku użyto bazy danych SQL Server Express LocalDB i przykładowej bazy danych Northwind.
Jeśli nie masz bazy danych SQL Server Express LocalDB, zainstaluj ją ze strony pobierania programu SQL Server Express lub za pośrednictwem Instalator programu Visual Studio. W Instalator programu Visual Studio można zainstalować bazę danych SQL Server Express LocalDB w ramach obciążenia Magazynu i przetwarzania danych lub jako pojedynczy składnik.
Zainstaluj przykładową bazę danych Northwind, wykonując następujące kroki:
W programie Visual Studio otwórz okno Eksplorator obiektów programu SQL Server. (Program SQL Server Eksplorator obiektów jest instalowany w ramach obciążenia Magazynu i przetwarzania danych w Instalator programu Visual Studio). Rozwiń węzeł PROGRAMU SQL Server. Kliknij prawym przyciskiem myszy wystąpienie bazy danych LocalDB i wybierz pozycję Nowe zapytanie.
Zostanie otwarte okno edytora zapytań.
Skopiuj skrypt Northwind Transact-SQL do schowka. Ten skrypt języka T-SQL tworzy bazę danych Northwind od podstaw i wypełnia ją danymi.
Wklej skrypt języka T-SQL do edytora zapytań, a następnie wybierz przycisk Wykonaj .
Po krótkim czasie zapytanie zakończy działanie i zostanie utworzona baza danych Northwind.
Tworzenie aplikacji i dodawanie linQ do klas SQL
Ponieważ pracujesz z klasami LINQ to SQL i wyświetlasz dane w formularzu systemu Windows, utwórz nową aplikację windows Forms i dodaj plik LINQ to SQL Classes.
Uwaga
Na komputerze mogą być wyświetlane różne nazwy lub lokalizacje niektórych elementów interfejsu użytkownika programu Visual Studio w tym artykule. Być może używasz innej wersji programu Visual Studio lub innych ustawień środowiska. Aby uzyskać więcej informacji, zobacz Personalizowanie środowiska IDE.
Aby utworzyć nowy projekt aplikacji Windows Forms zawierający klasy LINQ to SQL
W programie Visual Studio w menu Plik wybierz pozycję Nowy>projekt.
Rozwiń węzeł Visual C# lub Visual Basic w okienku po lewej stronie, a następnie wybierz pozycję Pulpit systemu Windows.
W środkowym okienku wybierz typ projektu Aplikacja Windows Forms.
Nadaj projektowi nazwę UpdatingWithSProcsWalkthrough, a następnie wybierz przycisk OK.
Zostanie utworzony projekt UpdatingWithSProcsWalkthrough i dodany do Eksplorator rozwiązań.
W menu Project (Projekt) kliknij pozycję Add New Item (Dodaj nowy element).
Kliknij szablon LINQ to SQL Classes (Klasy LINQ to SQL) i wpisz Northwind.dbml w polu Nazwa.
Kliknij przycisk Dodaj.
Pusty plik LINQ to SQL Classes (Northwind.dbml) jest dodawany do projektu, a zostanie otwarty projektant O/R.
Tworzenie klasy jednostki Customer i źródła danych obiektu
Utwórz klasy LINQ to SQL mapowane na tabele baz danych, przeciągając tabele z Eksploratora serwera lub Eksploratora baz danych do projektanta O/R. Wynikiem są klasy jednostek LINQ to SQL, które mapuje się na tabele w bazie danych. Po utworzeniu klas jednostek mogą być używane jako źródła danych obiektów, podobnie jak inne klasy, które mają właściwości publiczne.
Aby utworzyć klasę jednostki Klient i skonfigurować źródło danych przy użyciu niej
W Eksploratorze serwera lub Eksploratorze bazy danych znajdź tabelę Klient w wersji programu SQL Server przykładowej bazy danych Northwind.
Przeciągnij węzeł Klienci z Eksploratora serwera lub Eksploratora baz danych na powierzchnię *O/R Designer.
Zostanie utworzona klasa jednostki o nazwie Klient . Zawiera właściwości odpowiadające kolumnom w tabeli Customers. Klasa jednostek ma nazwę Customer (a nie Customers), ponieważ reprezentuje jednego klienta z tabeli Customers.
Uwaga
To zachowanie zmiany nazwy jest nazywane mnogią. Można ją włączyć lub wyłączyć w oknie dialogowym Opcje. Aby uzyskać więcej informacji, zobacz How to: Turn pluralization on and off (O/R Designer).
W menu Build (Kompilacja) kliknij pozycję Build UpdatingwithSProcsWalkthrough (Kompilowanie aktualizacji za pomocą poleceniaSProcsWalkthrough), aby skompilować projekt.
Aby otworzyć okno Źródła danych, w menu Dane kliknij pozycję Pokaż źródła danych.
W oknie Źródła danych kliknij pozycję Dodaj nowe źródło danych.
Kliknij pozycję Obiekt na stronie Wybierz typ źródła danych, a następnie wybierz przycisk Dalej.
Rozwiń węzeł AktualizowaniewithSProcsWalkthrough i znajdź i wybierz klasę Customer.
Uwaga
Jeśli klasa Customer jest niedostępna, anuluj działanie kreatora, skompiluj projekt i uruchom ponownie kreatora.
Kliknij przycisk Zakończ , aby utworzyć źródło danych i dodać klasę jednostki Customer do okna Źródła danych.
Tworzenie elementu DataGridView w celu wyświetlenia danych klienta w formularzu systemu Windows
Utwórz kontrolki powiązane z klasami jednostek, przeciągając elementy źródła danych LINQ to SQL z okna Źródła danych na formularz systemu Windows.
Aby dodać kontrolki powiązane z klasami jednostek
Otwórz formularz Form1 w widoku projektu.
Z okna Źródła danych przeciągnij węzeł Klient do formularza Form1.
Uwaga
Aby wyświetlić okno Źródła danych, kliknij pozycję Pokaż źródła danych w menu Dane .
Otwórz plik Form1 w Edytorze kodu.
Dodaj następujący kod do formularza, globalny do formularza, poza dowolną konkretną
Form1
metodą, ale wewnątrz klasy:Utwórz procedurę obsługi zdarzeń dla
Form_Load
zdarzenia i dodaj następujący kod do programu obsługi:
Implementowanie funkcji zapisywania
Domyślnie przycisk zapisywania nie jest włączony i funkcja zapisywania nie jest zaimplementowana. Ponadto kod nie jest automatycznie dodawany do zapisywania zmienionych danych w bazie danych po utworzeniu kontrolek powiązanych z danymi dla źródeł danych obiektów. W tej sekcji wyjaśniono, jak włączyć przycisk zapisywania i zaimplementować funkcję zapisywania dla obiektów LINQ to SQL.
Aby zaimplementować funkcję zapisywania
Otwórz formularz Form1 w widoku projektu.
Wybierz przycisk Zapisz na karcie CustomerBindingNavigator (przycisk z ikoną dyskietki).
W oknie Właściwości ustaw właściwość Enabled na True.
Kliknij dwukrotnie przycisk zapisz, aby utworzyć procedurę obsługi zdarzeń i przełączyć się do Edytora kodu.
Dodaj następujący kod do procedury obsługi zdarzeń przycisku zapisywania:
Zastąpić domyślne zachowanie w przypadku przeprowadzania aktualizacji (wstawiania, aktualizacji i usuwania)
Aby zastąpić domyślne zachowanie aktualizacji
Otwórz plik LINQ to SQL w projektancie O/R. (Kliknij dwukrotnie Plik Northwind.dbml w Eksplorator rozwiązań.
W Eksploratorze serwera lub Eksploratorze bazy danych rozwiń węzeł Procedury składowane bazy danych Northwind i znajdź procedury składowane InsertCustomers, UpdateCustomers i DeleteCustomers.
Przeciągnij wszystkie trzy procedury składowane do projektanta O/R.
Procedury składowane są dodawane do okienka metody jako DataContext metody. Aby uzyskać więcej informacji, zobacz Metody DataContext (O/R Designer).
Wybierz klasę jednostki Klient w projektancie O/R.
W oknie Właściwości wybierz właściwość Wstaw.
Kliknij wielokropek (...) obok pozycji Użyj środowiska uruchomieniowego , aby otworzyć okno dialogowe Konfigurowanie zachowania .
Wybierz Dostosuj.
Wybierz metodę InsertCustomers na liście Dostosowywanie .
Kliknij przycisk Zastosuj , aby zapisać konfigurację dla wybranej klasy i zachowania.
Uwaga
Możesz nadal konfigurować zachowanie dla każdej kombinacji klasy/zachowania, o ile po wprowadzeniu każdej zmiany klikniesz przycisk Zastosuj . Jeśli zmienisz klasę lub zachowanie przed kliknięciem przycisku Zastosuj, zostanie wyświetlone okno dialogowe ostrzeżenia z możliwością zastosowania wszelkich zmian.
Wybierz pozycję Aktualizuj na liście Zachowanie .
Wybierz Dostosuj.
Wybierz metodę UpdateCustomers na liście Dostosowywanie .
Sprawdź listę argumentów metody i właściwości klasy i zwróć uwagę, że istnieją dwa argumenty metody i dwie właściwości klasy dla niektórych kolumn w tabeli. Ułatwia to śledzenie zmian i tworzenie instrukcji sprawdzających naruszenia współbieżności.
Zamapuj argument metody Original_CustomerID na właściwość klasy CustomerID (Original).
Uwaga
Domyślnie argumenty metody są mapowane na właściwości klasy, gdy nazwy są zgodne. Jeśli nazwy właściwości są zmieniane i nie są już zgodne między tabelą a klasą jednostki, może być konieczne wybranie równoważnej właściwości klasy do mapowania, jeśli projektant O/R nie może określić poprawnego mapowania. Ponadto jeśli argumenty metody nie mają prawidłowych właściwości klasy do mapowania, możesz ustawić wartość Właściwości klasy na (Brak).
Kliknij przycisk Zastosuj , aby zapisać konfigurację dla wybranej klasy i zachowania.
Wybierz pozycję Usuń na liście Zachowanie .
Wybierz Dostosuj.
Wybierz metodę DeleteCustomers na liście Dostosowywanie .
Zamapuj argument metody Original_CustomerID na właściwość klasy CustomerID (Original).
Kliknij przycisk OK.
Uwaga
Mimo że nie jest to problem z tym konkretnym przewodnikiem, warto zauważyć, że linQ to SQL obsługuje automatycznie wartości generowane przez bazę danych dla tożsamości (automatyczne zwiększanie), rowguidcol (wygenerowany globalnie unikatowy identyfikator (GUID) i kolumny sygnatury czasowej podczas wstawiania i aktualizacji. Wartości wygenerowane przez bazę danych w innych typach kolumn będą nieoczekiwanie skutkować wartością null. Aby zwrócić wartości wygenerowane przez bazę danych, należy ręcznie ustawić IsDbGenerated true
wartość i AutoSync na jedną z następujących wartości: AutoSync.Always, AutoSync.OnInsert lub AutoSync.OnUpdate.
Testowanie aplikacji
Uruchom ponownie aplikację, aby sprawdzić, czy procedura składowana UpdateCustomers poprawnie aktualizuje rekord klienta w bazie danych.
Naciśnij klawisz F5.
Zmodyfikuj rekord w siatce, aby przetestować zachowanie aktualizacji.
Dodaj nowy rekord, aby przetestować zachowanie wstawiania.
Kliknij przycisk Zapisz, aby zapisać zmiany z powrotem w bazie danych.
Zamknij formularz.
Naciśnij F5 i sprawdź, czy zaktualizowany rekord i nowo wstawiony rekord zostały utrwalone.
Usuń nowy rekord utworzony w kroku 3, aby przetestować zachowanie usuwania.
Kliknij przycisk Zapisz, aby przesłać zmiany i usunąć usunięty rekord z bazy danych.
Zamknij formularz.
Naciśnij F5 i sprawdź, czy usunięty rekord został usunięty z bazy danych.
Uwaga
Jeśli aplikacja korzysta z programu SQL Server Express Edition, w zależności od wartości właściwości Copy to Output Directory pliku bazy danych, zmiany mogą nie być wyświetlane po naciśnięciu F5 w kroku 10.
Następne kroki
W zależności od wymagań aplikacji istnieje kilka kroków, które można wykonać po utworzeniu klas jednostek LINQ to SQL. Niektóre ulepszenia, które można wprowadzić w tej aplikacji, obejmują następujące elementy:
Zaimplementuj sprawdzanie współbieżności podczas aktualizacji. Aby uzyskać informacje, zobacz Optymistyczna współbieżność: omówienie.
Dodawanie zapytań LINQ w celu filtrowania danych. Aby uzyskać informacje, zobacz Wprowadzenie do zapytań LINQ (C#).