包含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>
有人可以解释一下当应用程序第一次启动时,应用程序如何知道为此应用程序创建数据库?
此外,在后续启动时,它是否使用Entity Framework访问身份表以进行身份验证?
解决方法
当您创建一个新的MVC 5应用程序并选择“个人用户帐户”时,包括一个新的ASP.NET身份提供程序,它使用Entity Framework 6 Code-First。
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服务器资源管理器将打开您的数据库。如果您已经尝试访问任何Identity功能,您将创建以下表:
> _MigrationHistory
> ASPNetRoles
> ASPNetUserClaims
> ASPNetUserLogins
> ASPNetUsers
默认情况下,您的应用程序配置为使用sql Server Compact(MDF文件),因此您不必有实际的sql Server实例运行。所有这一切都是可定制的。您的MDF文件的名称,Identity数据库的模式,sql Compact的选择与实际的sql Server实例。更改您的连接字符串,或创建一个新的连接并传递到您的上下文。
2)我的情况是什么?
所有这些都是好的,但是你提出的一个重要问题基本上是“我的上下文在哪里?”,以及关于如何进一步自定义数据库或更改验证逻辑的相关隐含问题。
你会注意到你的项目引用Microsoft.AspNet.Identity.EntityFramework。这个程序集是IdentityDBContext< TUser>和UserManager类的隐含。
打开您的AccountController,并注意构造函数有UserManager对象传递,依次传递一个新的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)我如何自定义我的身份计划?
另一个定义IN IdentityModels.cs文件的类是继承自IdentityUser类的ApplicationUser类。
- public class ApplicationUser : IdentityUser
- {
- }
您添加到此类的任何属性将保留在您的ASPNetUsers表中。模式的其余部分在IdentityDbContext类中定义。因此,虽然您可以通过将DBSet添加到上下文定义中来向您的身份模式添加更多表(例如权限)
- public DBSet<Privileges> { get; set; }
改变其他表(角色,声明等)也是可能的,但更多的涉及。例如,要自定义角色表,您必须实现从IdentityRole继承的NewIdentityRole并通过覆盖您的上下文的OnModelCreating()方法来添加它的关系。
这篇文章Customizing Roles Tables做了一个很好的描述所涉及的步骤。即使在这里,你会发现有很大的麻烦投入简单地添加新的列。从IdentityDbContext类中创建的原始模式中删除表或列可能与创建自己的IdentityDbContext类实现一样麻烦。