【问题标题】:ASP.NET Identity - What method creates the tables?ASP.NET Identity - 什么方法创建表?
【发布时间】:2013-12-31 22:47:42
【问题描述】:

当您在 VS2013 中使用个人用户帐户创建新的 MVC5 项目时,第一次尝试登录或注册新帐户时,会在 DefaultConnection 定义的数据库中自动创建帐户表 (dbo.AspNet*)。有谁知道项目中创建这些表的确切类/方法?

在 VS2012 / MVC4 中使用 SimpleMembership,表是使用这种方法创建的:

WebSecurity.InitializeDatabaseConnection("DefaultConnection", "UserProfile", "UserId", "UserName", autoCreateTables: true);

在 InitializeSimpleMembershipAttribute.cs 过滤器的 SimpleMembershipInitializer 类中调用。

在 VS2013 / MVC5 项目中我一直没能找到类似的方法。

有什么线索吗?

【问题讨论】:

  • 在 ASP.NET Identity 中没有这样的方法。还有其他方法可以自定义 ASP.NET 标识。您是否因为想要自定义 ASP.NET Identity 的工作方式而寻找这种方法?如果您询问如何执行此类自定义,您可能会得到更多有用的答案。
  • 此时我只是在寻找创建身份表的方法,因为我想了解每一点的工作原理。

标签: asp.net-mvc-5 asp.net-identity asp.net-authentication


【解决方案1】:

默认情况下,MVC5 模板依赖 EntityFramework CodeFirst 的默认数据库初始化程序在第一次需要时创建数据库。

See CreateDatabaseIfNotExists

【讨论】:

  • 郝,你能再解释一下吗?我仍然很困惑,因为我在项目的任何地方都找不到 CreateDatabaseIfNotExists 方法调用。
  • 项目中没有方法调用,这是EntityFramework在需要的时候自动完成的,第一次查询完成。如果你想自定义这个,你需要插入你自己的初始化器,或者你可以在你的 DbContext 中挂钩/覆盖 OnModelCreating 方法
【解决方案2】:

查看由 IdentityDbContext (Microsoft.AspNet.Identity.EntityFramework) 继承的 DbContext (System.Data.Entity),由 ApplicationDbContext 继承,您将在默认 Visual Studio 2013 ASP 的 IdentityModels.cs 中找到它。 NET Web 应用程序/MVC 模板。

AccountController 为您提供了有关上述内容如何在其初始化过程中发挥作用的线索:

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

(如果您希望自定义,Kevin 在他的评论中是对的。例如,可以通过 ApplicationUser 轻松地将属性添加到 User,并且可以通过您自己的实现像往常一样实现更多控制无论如何。旧的身份和身份验证架构已被 OWIN/Katana 完全取代。)

编辑:实际上,我可能稍微误读了您的问题。如果需要,实际创建数据库的代码可能位于 CreateDatabaseIfNotExists 类 (System.Data.Entity) 之类的东西中。我不确定从哪个上下文调用哪个确切的实现,但显然创建数据库是实体框架的责任。

尽管如此,使用 dotPeek、ILSpy、ReSharper 或类似的东西,如果您开始探索我最初提到的类,您应该能够找到所需的内容。 (关于这里不是改变行为的地方的建议仍然存在。)

希望这会有所帮助。

【讨论】:

  • Oskar,正如我上面对 Hao 所说的,我在项目的任何地方都没有找到 CreateDatabaseIfNotExists 方法调用,所以我仍然不知道是什么方法调用是如何创建数据库和表。我在单步执行代码时使用了 SQL Profiler,发现它都是在调用 UserManager.CreateAsync 之后创建的,但那是为了创建一个新用户。深入研究与 UserManager 相关的各种类型和类并没有发现对 CreateDatabaseIfNotExists 的调用。
猜你喜欢
  • 2017-10-30
  • 1970-01-01
  • 1970-01-01
  • 2014-04-23
  • 1970-01-01
  • 2021-05-16
  • 2014-08-29
  • 1970-01-01
  • 2021-08-18
相关资源
最近更新 更多