Jak nowy ASP.NET aplikacja MVC 5 wie jak utworzyć bazę danych i w jaki sposób Kontroler konta uzyskuje dostęp do bazy danych?

I created an ASP.NET MVC 5 Zastosowanie Aktualizacja Visual Studio 2013 2. W aplikacji mam kontrolera konta. Różni się od tego, do czego jestem przyzwyczajony i nie zawiera instancję dbcontext.

public class AccountController : Controller
{
    private ApplicationUserManager _userManager;

    public AccountController()
    {
    }

    public AccountController(ApplicationUserManager userManager)
    {
        UserManager = userManager;
    }

    public ApplicationUserManager UserManager {
        get
        {
            return _userManager ?? HttpContext.GetOwinContext().GetUserManager<ApplicationUserManager>();
        }
        private set
        {
            _userManager = value;
        }
    }

Mój web.config który jest tworzony domyślnie ma łańcuch połączeń taki jak:

  <connectionStrings>
    <add name="DefaultConnection" connectionString="Data Source=(LocalDb)\v11.0;AttachDbFilename=|DataDirectory|\aspnet-WebApplication3-20140417072624.mdf;Initial Catalog=aspnet-WebApplication3-20140417072624;Integrated Security=True"
      providerName="System.Data.SqlClient" />
  </connectionStrings>

Może mi ktoś wyjaśnić skąd aplikacja wie, aby utworzyć bazę danych dla tej aplikacji, gdy zaczyna się po raz pierwszy?

Również, przy kolejnych uruchomieniach, używa struktury encji, aby uzyskać dostęp do tabel tożsamości do uwierzytelniania?

Author: Dave Alperovich, 2014-04-17

3 answers

1) CO TU SIĘ DZIEJE:

Kiedy tworzysz nowy MVC 5 aplikacji i wybierz " Indywidualne Konta użytkowników ", nowy ASP.NET dostawca tożsamości jest zawarte, które wykorzystuje Entity Framework 6 Code-First.

[22]}Microsoft przyjął EF-Code-First , aby tożsamość była jak najbardziej konfigurowalna.

Gdy tożsamość jest dostępna po raz pierwszy, ramy podmiotowe sprawdza, czy baza danych istnieje. O ile nie skonfigurowano inaczej, używa "DefaultConnection" do znalezienia bazy danych tożsamości. Jeśli baza danych nie istnieje podczas wywoływania tożsamości, EF automatycznie utworzyła bazę danych.

Zwróć uwagę, że łańcuch połączeń zawiera

`AttachDbFilename=|DataDirectory|\aspnet-WebApplication3-20140417072624.mdf`

Jeśli otworzysz swoje App_Data Folder, powinieneś mieć aspnet-Webaplication3-20140417072624.plik mdf .

Jeśli kliknij dwukrotnie na to .mdf file, the VS2013 Server Explorer otworzy Twój DB. Jeśli próbowałeś już uzyskać dostęp do dowolnej funkcjonalności tożsamości, będziesz te tabele utworzony:

  • _migracjahistoria
  • Aspnetrole
  • ASPNetUserClaims
  • ASPNetUserLogins
  • ASPNetUsers

Domyślnie Twoja aplikacja jest skonfigurowana do używania SQL Server Compact (plik MDF), więc nie musisz mieć Rzeczywistego SQL Server uruchamianie instancji. Wszystko to jest konfigurowalny. Nazwę pliku MDF, schemat bazy danych tożsamości, wybór SQL Compact vs rzeczywisty SQL Server przykład. Zmień Łańcuch Połączenia lub utwórz nowy i przekaż to nowe połączenie do kontekstu.


2) GDZIE JEST MÓJ KONTEKST?

Wszystko to jest dobre i dobre, ale ważne pytanie, które zadałeś, to w zasadzie " gdzie jest mój kontekst?", A tak samo istotne implikowane pytania dotyczące sposobu dalszego dostosowywania bazy danych lub zmiany logiki walidacji.

Zauważysz, że twój projekt odwołuje się Microsoft.AspNet.Identity.EntityFramework. Zbiór ten jest implementacją klasy IdentityDBContext<TUser> i zaimplementowaniem klasy UserManager.

Otwórz swoje AccountController, zauważ, że konstruktor przekazał UserManager obiekt, który z kolei przekazał new UserStore obiekt, który otrzymał ApplicationDbContext.

    public AccountController()
        : this(new UserManager<ApplicationUser>(new UserStore<ApplicationUser>(new ApplicationDbContext())))

ApplicationDbContext jest zdefiniowany w folderze Models. Wewnątrz ten folder, znajdzieszIdentityModels.cs plik. Otwórz go, a zobaczysz

public class ApplicationDbContext : IdentityDbContext<ApplicationUser>
{
    public ApplicationDbContext()
        : base("DefaultConnection")
    {
    }
}

Tutaj przypisany jest kontekst tożsamości. możesz zmienić nazwę połączenia przekazaną konstruktorowi ApplicationDbContext lub zdefiniować i użyć innego kontekstu w kontrolerze konta.


3) JAK DOSTOSOWAĆ MÓJ SCHEMAT TOŻSAMOŚCI?

Kolejna klasa zdefiniowana w IdentityModels.cs plik jest klasą ApplicationUser, która dziedziczy z klasy IdentityUser.

public class ApplicationUser : IdentityUser
{
}

Wszelkie właściwości, które dodasz do tej klasy, będą przechowywane w Twoim ASPNetUsers stolik. Reszta schematu jest zdefiniowana w klasie IdentityDbContext. Tak więc, chociaż możesz dodać więcej tabel (np. przywileje) do schematu tożsamości, dodając DBSet do definicji kontekstu,

public DBSet<Privileges> { get; set; }

Zmiana innych tabel (role, roszczenia itp.) jest również możliwa, ale znacznie bardziej zaangażowana. Na przykład, aby dostosować tabelę role, należy musisz zaimplementować NewIdentityRole dziedziczenie z IdentityRole i dodać jego relację przez nadpisanie metody OnModelCreating() dla Twojego kontekstu.

Ten artykuł na dostosowywanie tabel ról dobrze opisuje kroki. Nawet tutaj przekonasz się, że istnieje znaczny kłopot zainwestowany w proste dodawanie nowych kolumn. Usunięcie tabel lub kolumn z oryginalnego schematu utworzonego w klasie IdentityDbContext jest prawdopodobnie tak samo kłopotliwe jak tworzenie własnych Implementacja klasy IdentityDbContext.

 78
Author: Dave Alperovich,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-04-19 22:37:58

Z pewnością byłoby to w ApplicationUserManager, moim zdaniem jest to usługa, która wykorzystuje kontekst db w celu zarządzania użytkownikami aplikacji.

Możesz kliknąć prawym przyciskiem myszy na tej klasie i kliknąć {[1] } i tak dalej, aż zobaczysz klasę, która inicjalizuje bazę danych.

Również w MVC 4 inicjalizacja odbywa się w atrybucie filtra. Zajrzyj więc do folderu filtrów, jeśli taki istnieje. Wiem, że to nie MVC 5. Ale nadal może mieć zastosowanie.

 0
Author: Callum Linington,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-04-19 14:35:25

Jak zauważyła Melina, pierwotne pytanie odnosiło się do obecnego ASP.NET tożsamość 2.model X.

[[2]] odpowiedź Dave 'a Alperovich' a dostarczyła cennych informacji na temat pojęć stojących za ASP.NET tożsamości, choć przykłady zostały zaczerpnięte z ASP.NET tożsamość 1.x, który został zastąpiony w 2014 roku. Callum Linington podaje odpowiedź "naucz człowieka łowić ryby". Podążając za jego radą, łatwo zauważyć, że 2.x Klasa "ApplicationUserManager" pochodzi z 1.X-style "UserManager".

Odpowiedź jest zasadniczo taka, że "ApplicationUserManager", który jest wstrzykiwany jako parametr podczas tworzenia "AccountController", łączy się z przechowywaniem danych tożsamości we własnym konstruktorze:

var manager = new ApplicationUserManager(new UserStore<ApplicationUser>(context.Get<ApplicationDbContext>()));

Zauważ jak to "Ukryte" 2.kod x jest bardzo podobny do 1.kod x podany powyżej:

public AccountController()
    : this(new UserManager<ApplicationUser>(new UserStore<ApplicationUser>(new ApplicationDbContext())))
 0
Author: Scott Taylor,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-12-15 17:24:44