Microsoft.NET: ASP.NET MVC + Entity Framework (Code First) Do realizacji projektu potrzebne jest zintegrowane środowisko programistyczne Microsoft Visual Studio 2015. W ramach projektu budowana jest prosta aplikacja wykorzystująca framework MVC, bazująca na modelu bazy danych utworzonym zgodnie ze strategią Code First. Aplikacja zostanie wygenerowana narzędziem MVC Scaffolding. Kroki ćwiczenia: 1. Utworzenie nowego projektu. a) Uruchom narzędzie Microsoft Visual Studio jeśli nie jest jeszcze uruchomione. b) Z menu głównego wybierz File New Project. Wybierz szablon ASP.NET Web Application z kategorii Visual C# -> Web. Jako nazwę projektu podaj MvcNews. Pozostałe opcje pozostaw domyślne i kliknij przycisk OK. c) W kolejnym kroku kreatora jako szablon projektu wybierz MVC. Nie zaznaczaj opcji tworzenia projektu dla testów jednostkowych.
d) Obejrzyj strukturę projektu w panelu Solution Explorer zwracając uwagę na utworzone przez kreator foldery. e) Obejrzyj kod startowy aplikacji w pliku Global.asax.cs. Odszukaj w folderze App_Start plik zawierający reguły routingu dla aplikacji i obejrzyj jego zawartość. f) Uruchom projekt kombinacją klawiszy Ctrl+F5. g) Przetestuj nawigację po stronach aplikacji zwracając uwagę na zawartość paska adresu w przeglądarce. 2. Utworzenie obiektowego modelu danych w projekcie zgodnie ze strategią Code First. a) W panelu Solution Explorer wywołaj prawym klawiszem myszy menu kontekstowe dla folderu Models projektu i wybierz opcję Add -> Class. Jako nazwę pliku podaj NewsItem.cs.
b) W utworzonej klasie zdefiniuj jako publiczne poniższe właściwości: int DateTime string typ nazwa Id TimeStamp Text c) W tym samym pliku (i w tej samej przestrzeni nazw) dodaj poniższą klasę kontekstu bazy danych: public class NewsDBContext : DbContext { public DbSet<NewsItem> News { get; set; } } Zaimportuj odpowiednią przestrzeń nazw. d) Przejdź do edycji głównego pliku Web.config projektu. W sekcji <connectionstrings> dodaj poniższą definicję połączenia z bazą danych: <add name="newsconnection" connectionstring="data Source=(LocalDb)\ MSSQLLocalDB; Integrated Security=SSPI; AttachDBFilename= DataDirectory \News.mdf" providername="system.data.sqlclient" /> Zwróć uwagę, że wskazany plik bazy danych jeszcze nie istnieje. Zostanie on utworzony automatycznie zgodnie ze strategią Code First. e) Zdefiniowany wcześniej kontekst bazy danych domyślnie oczekuje połączenia z bazą danych o nazwie takiej jak nazwa klasy kontekstu. Ponieważ zdefiniowaliśmy połączenie o innej nazwie, musimy je jawnie przypisać do kontekstu definiując w klasie kontekstu poniższy konstruktor. public NewsDBContext () : base("newsconnection") {} f) Przebuduj projekt (Build). 3. Wygenerowanie kontrolerów i widoków do obsługi modelu. a) Z menu kontekstowego węzła Controllers w panelu Solution Explorer wybierz opcję Add -> Controller. W kreatorze kontrolera wybierz szablon scaffoldingu MVC 5 controller with views, using Entity Framework. W kolejnym kroku kreatora wybierz utworzoną wcześniej klasę modelu i kontekstu bazy danych oraz popraw nazwę klasy kontrolera na NewsController. Pozostałe opcje pozostaw domyślne i kliknij przycisk Add. b) Obejrzyj wygenerowaną klasę kontrolera i związane z nim widoki. c) Odszukaj w strukturze projektu stronę wzorcową _Layout.cshtml i dodaj w menu, które wyświetla się na każdej stronie u góry, link wywołujący akcję Index kontrolera News.
d) Uruchom aplikację (Ctrl+F5) i przetestuj jej działanie dodając, edytując, przeglądając i usuwając dane. Uwaga: Wprowadzając nowe dane etykietę czasową podawaj w formacie YYYY-MM-DD HH24:MI:SS (możesz pominąć czas i podać samą datę). e) Poprzez panel Server Explorer połącz się z bazą danych i obejrzyj zawartość automatycznie utworzonej tabeli NewsItems. 4. Ustawienie domyślnej daty dodawanych newsów na bieżącą. a) Dodaj publiczny konstruktor w klasie NewsItem, który ustawi datę na bieżącą (System.DateTime.Now). b) W metodzie Create() kontrolera News (wywoływanej metodą GET HTTP) utwórz nowy obiekt NewsItem i przekaż go do widoku. c) Uruchom aplikację i przetestuj dodawanie nowych newsów. 5. Dodanie obowiązkowości i weryfikacji długości tekstu newsa. a) Dodaj w klasie encji NewsItem następujące adnotacje: (1) włączającą obowiązkowość tekstu newsa, (2) weryfikującą, że jego długość wynosi od 5 do 140 znaków, (3) wskazującą że etykieta czasowa newsa jest typu daty (aby nie wyświetlały się składniki czasu). Nie zapomnij o zaimportowaniu przestrzeni nazw adnotacji. b) Uruchom aplikację aby przetestować działanie dodanych adnotacji. Zinterpretuj wyjątek, który zostanie zgłoszony. 6. Migracja bazy danych aby odpowiadała ona zmodyfikowanemu modelowi aplikacji. a) Przebuduj projekt (Rebuild). b) Otwórz okno narzędzia Package Manager Console (Tools->NuGet Package Manager->Package Manager Console). c) Wykonaj w oknie Package Manager Console kolejno poniższe komendy. Ewentualnie skoryguj w pierwszym poleceniu nazwę typu kontekstu obsługującego newsy jeśli jest inna w Twoim projekcie. Enable-Migrations -ContextTypeName MvcNews.Models.NewsDBContext add-migration AddDataAnnotationsMig update-database d) Ponownie uruchom projekt i przetestuj walidację ograniczeń na treść newsa. 7. Zmiana formatu daty. a) Poprzedź właściwość TimeStamp w klasie NewsItem poniższą adnotacją ustawiającą format daty. [DisplayFormat(DataFormatString = "{0:yyyy-MM-dd}", ApplyFormatInEditMode = true)]
b) Ponownie uruchom projekt i przetestuj czy zmiana formatu daty została uwzględniona. Zadanie do samodzielnego wykonania 1. Wejdź na stronę aplikacji w dwóch przeglądarkach i sprawdź zachowanie aplikacji w przypadku współbieżnej edycji treści tego samego newsa. 2. Włącz mechanizm optymistycznego zarządzania współbieżnością dla encji NewsItem z wykorzystaniem dedykowanej do tego celu właściwości (rowversion): - dodaj w klasie encji NewsItem publiczną właściwość RowVersion typu byte[] i oznacz ją adnotacją [Timestamp] - dodaj migrację AddRowVersionMig i uaktualnij bazę danych - obejrzyj dodaną w wyniku migracji kolumnę do tabeli, zwracając uwagę na jej typ - zmień adnotację Bind metody kontrolera do edycji newsa wołanej przez POST, tak aby uwzględniała dodaną do encji właściwość wersji - spraw aby właściwość wersji była uwzględniona na stronie do edycji newsa jako ukryte pole formularza, analogicznie do identyfikatora encji (bez tego oryginalna wartość właściwości wersji byłaby tracona w procesie edycji danych w aplikacji ASP.NET MVC!) - uruchom aplikację w dwóch przeglądarkach i ponownie przetestuj współbieżną edycję danych 3. Dodaj obsługę wyjątku optymistycznego zarządzania współbieżnością - otocz instrukcje odpowiedzialne za zapis zmodyfikowanej encji (wewnątrz instrukcji if sprawdzającej poprawność modelu) instrukcją try/catch łapiąc odpowiedni wyjątek - w sekcji obsługi wyjątku pomocą metody ModelState.AddModelError dodaj komunikat informujący o tym że edytowane dane zostały zmodyfikowane lub usunięte przez innego użytkownika - ponownie uruchom aplikację w dwóch przeglądarkach i ponownie przetestuj współbieżną edycję danych