2015-01-18 14 views
6

Powinienem napisać to oświadczenie z informacją, że jestem nowy w rozwoju ASP.NET i nie rozumiem kontekstów bazy danych, pomimo spędzania ostatniej godziny na czytaniu dokumentacji. Kiedy zbudowałem moją aplikację ASP.NET MVC 5, wybrałem indywidualne uwierzytelnianie konta użytkownika. Program Visual Studio utworzył plik o nazwie IdentityModels.cs, w którym zdefiniował klasę ApplicationUser i klasę ApplicationDbContext.Zastępowanie automatycznie utworzonego ApplicationDbContext

Zrobiłem trochę prac rozwojowych, a moje kontrolerów CRUD używać ApplicationDbContext mówić do bazy danych, poprzez tę własność prywatną na każdym kontrolerze:

private ApplicationDbContext db = new ApplicationDbContext(); 

W działaniach kontrolerów I wtedy robić takie rzeczy jak:

Chcę uporządkować zawartość kontekstu bazy danych, ale najpierw muszę to zrozumieć. Moje główne pytania to:

  1. Czy można używać tylko jednego kontekstu bazy danych dla całej mojej aplikacji, tak jak teraz? Czy mogę zastąpić klasę ApplicationDbContext zdefiniowaną w IdentityModels.cs moją własną?
  2. Klasa ApplicationDbContext wywodzi się z IdentityDbContext<ApplicationUser>, oznacza to, że powinienem mieć oddzielne konteksty bazy danych dla moich informacji uwierzytelniających użytkownika dostarczonych przez Visual Studio i mój własny kod?

Myślę, że moim celem końcowym jest użycie mojego własnego kontekstu bazy danych o nazwie DatabaseContext, który jest następnie używany w kontrolerze bazowym, z którego dziedziczą wszystkie moje kontrolery. Wtedy mam tylko jedno miejsce, w którym kontekst bazy danych jest tworzony, zamiast w każdym kontrolerze.

Kto wie, może myślę w niewłaściwy sposób. Każdy wydaje się mieć swój własny preferowany sposób radzenia sobie z tym.

Dziękujemy!

Odpowiedz

8

Czy można używać tylko jednego kontekstu bazy danych dla całej mojej aplikacji, tak jak teraz?

  • Jeśli zdecydowałeś, że będziesz mieć dostęp do DB bezpośrednio z warstwy interfejsu użytkownika (który jest oddzielną dyskusję) niż to jest w porządku, ponieważ ApplicationDbContext jest prywatne pole kontrolera i kontrolery są tworzone i usuwane na żądanie - ApplicationDbContext zostanie utworzone i usunięte na żądanie.

Czy mogę zastąpić klasę ApplicationDbContext zdefiniowaną w IdentityModels.cs moją własną?

  • Zdecydowanie możesz to zrobić. Jest on używany do utworzenia UserStore który odbiera DbContext jako argumentu w konstruktorze tak to

var manager = new ApplicationUserManager(new UserStore<ApplicationUser>(new CustomDbContext("connection")));

zadziała.Nadal musisz się upewnić, że ApplicationUser jest jednostką w Twoim kontekście niestandardowym. Oczywiście można również zastąpić/zastąpić ApplicationUser.

Klasa ApplicationDbContext wywodzi IdentityDbContext, to znaczy powinien mieć oddzielne konteksty bazy danych dla mojego użytkownika uwierzytelniania rzeczy pod warunkiem przez Visual Studio, a mój własny kod?

Domyślnie Asp.Net Identity generuje nową bazę danych dla Ciebie i ApplicationDbContext skonfigurowaną do pracy z tą bazą danych. Możesz również przechowywać jednostki powiązane z uwierzytelnianiem w dowolnej innej bazie danych, wystarczy, że wszystkie powiązane tabele są dostępne. Możesz również rozszerzyć tę bazę danych, aby uwzględnić inne tabele używane w aplikacji, abyś mógł używaj tego samego kontekstu wszędzie.

PS:ApplicationDbContext nie musi realizować IdentityDbContext<ApplicationUser>, Przedłużanie domyślny DbContext działa tak samo (jeśli już wygenerowany Db będzie trzeba aktualizować \ migracji należy użyć kodu na poniższym do pracy):

public class ApplicationDbContext : DbContext 
    { 
    public ApplicationDbContext() 
     : base("DefaultConnection") 
    { 
    } 

    public static ApplicationDbContext Create() 
    { 
     return new ApplicationDbContext(); 
    } 
    } 
+0

doskonały, dziękuję Alex. :) –

+0

Nie sądzę, że twoje ostatnie zdanie jest poprawne. Jeśli zmienisz wartość ApplicationDbContext na pochodną DbContext, stracisz wszystkie przesłonięcia wykonane w IdentityDbContext, które są niezbędne do prawidłowego funkcjonowania systemu tożsamości. IdentityDbContext zastępuje OnModelCreating, więc istnieje dodatkowy problem: jeśli chcesz zastąpić OnModelCreating w ApplicationDbContext, musisz skopiować nadpisania w IdentityDbContext. https://github.com/aspnet/Identity/blob/dev/src/Microsoft.AspNet.Identity.EntityFramework/IdentityDbContext.cs –

+0

Powinieneś spojrzeć na ostatnie stwierdzenie w kontekście poprzedniego akapitu: "Domyślnie Asp. Net Identity generuje nową bazę danych dla ciebie i ApplicationDbContext skonfigurowaną do pracy z tą bazą danych.Możesz przechowywać swoje jednostki powiązane z uwierzytelnianiem w dowolnej innej bazie danych, musisz tylko upewnić się, że wszystkie powiązane tabele są tam. rozszerz również tę bazę danych, aby uwzględnić inne tabele używane w aplikacji, aby można było używać tego samego kontekstu wszędzie. " –

1

Myślę, że chciałbyś stworzyć swoją własną niestandardową bazę danych uwierzytelniających do uwierzytelniania logowania. Musisz postępować zgodnie z podanymi instrukcjami krok po kroku. 1) musisz utworzyć własną klasę, aby zaimplementować uwierzytelnianie niestandardowe. na przykład tworzę następującą klasę uczniów. Możesz utworzyć tę klasę w sekcji MODEL w MVC.

class student{ 
public int rollno{get;set;} 
public string firstName{get;set;} 
public string lastName{get;set;} 

2) teraz utworzymy własny tekst dbcontext przy użyciu identityDbContext dla klasy ucznia. możesz utworzyć tę klasę w sekcji App_Start w ten sposób.

public class ApplicationDbContext : IdentityDbContext<student> 
    { 
     public ApplicationDbContext() : base() 
     { 

     } 

     public static ApplicationDbContext Create() 
     { 
      return new ApplicationDbContext(); 
     } 

3) Teraz można go używać w domu kontrolera jak postępować

public class HomeController : Controller 
    { 
     // GET: Home 
     public async Task<ActionResult> Index() 
     { 
      var context = new ApplicationDbContext(); // DefaultConnection 
      var store = new UserStore<student>(context); 
      var manager = new UserManager<student>(store); 
      var signInManager = new SignInManager<student, string>(manager, 
       HttpContext.GetOwinContext().Authentication); 
      var username = "Edward"; 
      var email = "[email protected]"; 
      var password = "Your password"; 
      var user = await manager.FindByEmailAsync(email); 

      if (user == null) 
      { 
       user = new student     { 
        UserName = username,//username ,Email are getting from identityDbContext and the other three RollNO,FirstName and LastName are your own Custom members.so like this you can extend your any kind of data you like add or extend with IdentityDbContext. 
        Email = email, 
        RollNo = "15", 
        FirstName = "David", 
        LastName = "Kandel" 
       }; 

       await manager.CreateAsync(user, password); 
      } 
      else 
      { 
       var result = await signInManager.PasswordSignInAsync(user.UserName, password, true, false); 

       if (result == SignInStatus.Success) 
       { 
        return Content("Hello, " +user.rollno + "" + user.FirstName + " " + user.LastName); 
       } 

           } 


      return Content("Hello, Index"); 
     } 
    }