包含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类实现一样麻烦。