Programowanie w C# 6.0 z Visual Studio 2015

Pytanie uczestnika, które pojawiły się podczas szkolenia Programowanie w C# 6.0 z Visual Studio 2015 realizowanego w dniach 11-15.01.2017r.


W jaki sposób EF znajduje połączenie do bazy danych?

Entity Framework znajduje połączenie w oparciu o plik konfiguracyjny app.config lub web.config zależnie od typu aplikacji. Wpis powinien znajdować się w kolekcji connectionstrings.

Zasada działania:

  1. Szuka wpisu o nazwie podanej w konstruktorze DbContext. Jeśli nie znajdzie przechodzi do kolejnego kroku.
  2. Szuka wpisu o nazwie klasy kontekstu.
  3. Szuka instancji SQL Express
  4. Szuka bazy danych LocalDb. Zależnie od wersji adres wygląda następująco (localdb)\projectsV13
  5. Szuka bazy danych LocalDb o adresie (localdb)\mssqllocaldb

dokładniejszy opis: https://github.com/sulmar/ef-tutorial/wiki/Opis


W jaki sposób wdrażać aplikacje oraz usługi webowe?

Naj prościej można to zrobić za pomocą opcji Publish na projekcie. Mamy do wyboru 4 metody:

  • Web Deploy
  • Web Deploy Package
  • FTP
  • File System

File System - projekt kopiowany jest do katalogu . Następnie trzeba przenieść pliki na serwer oraz samodzielnie utworzyć aplikację webową na serwerze IIS.

FTP - podobne działanie jak File System z tym, że pliki kopiowane poprzez protokół FTP.

Web Deploy Package - tworzona jest paczka instalacyjna(rozszerzenie pckg). Taką paczkę przenosimy na serwer i za pomocą narzędzia Web Deploy (trzeba go wcześniej zainstalować na serwerze) można wskazać paczkę i instalacja odbędzie się automatycznie. Connection string zostanie automatycznie podmieniony na produkcyjny.

Web Deploy - najwygodniejszy sposób. Wystarczy wskazać docelowy adres serwera na którym ma zostać zainstalowana aplikacja webowa i nacisnąć Publish. Na serwerze musi być zainstalowana usługa Web Deploy oraz skonfigurowane uprawnienia.

W jaki sposób walidować obiekty w ASP.NET?

ASP.NET posiada wbudowany mechanizm walidacji za pomocą atrybutów (annotations). Wystarczy dodać atrybut np. [Required] do właściwości na klasie modelu. Dostępne atrybuty można znaleźć tutaj.

Warto zaznaczyć, że można utworzyć walidację opartą o wyrażenie regularne [RegularExpression] i w ten sposób sprawdzić poprawność np. kodu pocztowego.

Niestety problem pojawia się gdy chcemy użyć bardziej złożonych walidacji składających się z kilku właściwości, np. data zakończenia nie może być wcześniejsza od daty rozpoczęcia. Mechanizm annotacji tego nie umożliwia.

Dlatego polecam bibliotekę FluentValidation, która umożliwia tworzenie prostych oraz zaawansowanych walidacji. Walidacje zapisuje się w osobnych klasach za pomocą wyrażeń Lambda.

  1. Do projektu webowego należy dodać bibliotekę PM> Install-Package FluentValidation.MVC5
  2. W pliku Global.asax w Application_Start dodać wpis: FluentValidationModelValidatorProvider.Configure();
  3. Utworzyć walidator - klasa musi dziedziczyć po AbstractValidator

    [Validator(typeof(PersonValidator))]
    public class Person {
    public int Id { get; set; }
    public string Name { get; set; }
    public string Email { get; set; }
    public int Age { get; set; }
    }
  4. Dodać do klasy modelu atrybut

    [Validator(typeof(PersonValidator))]
    public class Person {
    public int Id { get; set; }
    public string Name { get; set; }
    public string Email { get; set; }
    public int Age { get; set; }
    }
    Albo wskazać walidator w konfiguracji:
    FluentValidationModelValidatorProvider.Configure(provider => {
    provider.ValidatorFactory = new MyCustomValidatorFactory();
    });
  5. Teraz w kontrolerze możemy dokonać walidacji:

    public class PeopleController : Controller {
    public ActionResult Create() {
    return View();
    }

    [HttpPost]
    public ActionResult Create(Person person) {

    if(! ModelState.IsValid) { // re-render the view when validation failed.
    return View("Create", person);
    }

    return RedirectToAction("Index");

    }
    }