Asp.net

新的 ASP.NET MVC 5 應用程序如何知道如何創建數據庫以及帳戶控制器如何訪問數據庫?

  • April 17, 2014

我使用Visual Studio 2013 Update 2創建了一個ASP.NET MVC 5應用程序。在應用程序中,我有一個帳戶控制器。它與我習慣的不同,並且不包含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;
       }
   }

預設情況下創建的我web.config的連接字元串如下:

 <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>

有人可以向我解釋應用程序第一次啟動時如何知道為該應用程序創建數據庫嗎?

此外,在隨後的啟動中,它是否使用實體框架來訪問身份表來進行身份驗證?

1)這裡發生了什麼:

當您創建一個新的MVC 5應用程序並選擇“個人使用者帳戶”時,將包含一個使用Entity Framework 6 Code-First的新ASP.NET 身份提供程序

Microsoft 已採用EF-Code-First來使Identity盡可能可定制。

第一次訪問 Identity 時,Entity Framework會檢查數據庫是否存在。除非另有配置,否則它使用"DefaultConnection"來查找身份數據庫。如果呼叫 Identity 時數據庫不存在,EF會自動創建數據庫。

請注意您的連接字元串包含

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

如果您打開App_Data文件夾,您應該有一個aspnet-WebApplication3-20140417072624.mdf文件。

如果你點兩下這個**.mdf**文件,VS2013 Server Explorer將打開你的數據庫。如果您已經嘗試訪問任何身份功能,您將創建這些表:

  • _遷移歷史
  • ASPNet 角色
  • ASPNetUserClaims
  • ASPNetUserLogins
  • ASP 網路使用者

預設情況下,您的應用程序配置為使用SQL Server Compact(MDF 文件),因此您不必執行實際的SQL Server實例。所有這些都是可定制的。您的 MDF 文件的名稱、身份數據庫的架構、SQL Compact與實際SQL Server實例的選擇。更改您的連接字元串,或創建一個新連接並將這個新連接傳遞給您的上下文。


2) 我的語境在哪裡?

這一切都很好,但是您問的一個重要問題基本上是“我的上下文在哪裡? ”,以及有關如何進一步自定義數據庫或更改驗證邏輯的相關隱含問題。

您會注意到您的項目引用了Microsoft.AspNet.Identity.EntityFramework. 該程序集是 Class 的實現IdentityDBContext<TUser>和實現UserManager

打開您的AccountController,注意建構子傳遞了一個對象,而該對象又傳遞UserManager了一個new UserStore對象,該對像傳遞了一個ApplicationDbContext.

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

ApplicationDbContext在您的模型文件夾中定義。在該文件夾中,您將找到一個IdentityModels.cs文件。打開它你會看到

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

這是您的身份上下文被分配的地方。您可以更改傳遞給ApplicationDbContext建構子的連接名稱,或者在您的帳戶控制器中定義和使用不同的上下文。


3) 我如何自定義我的身份架構?

在IdentityModels.cs文件中定義的另一個類是ApplicationUser從類繼承的IdentityUser類。

public class ApplicationUser : IdentityUser
{
}

您添加到此類的任何屬性都將保留在您的ASPNetUsers表中。模式的其餘部分在IdentityDbContext類中定義。因此,雖然您可以通過將 DBSet 添加到上下文定義中來將更多表(例如權限)添加到您的身份架構中,

public DBSet<Privileges> { get; set; }

更改其他表(角色、聲明等)也是可能的,但涉及更多。例如,要自定義Roles表,您必須實現NewIdentityRole繼承IdentityRole並通過覆蓋OnModelCreating()Context 的方法來添加它的關係。

這篇關於**自定義角色表**的文章很好地描述了所涉及的步驟。即使在這裡,您也會發現簡單地添加新列會帶來很大的麻煩。從類中創建的原始模式中刪除表或列IdentityDbContext可能與創建自己的IdentityDbContext類實現一樣麻煩。

引用自:https://stackoverflow.com/questions/23130795