一个新的ASP.NET MVC 5应用程序如何知道如何创建数据库,以及帐户控制器如何访问数据库?

前端之家收集整理的这篇文章主要介绍了一个新的ASP.NET MVC 5应用程序如何知道如何创建数据库,以及帐户控制器如何访问数据库?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我使用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>

有人可以解释一下当应用程序第一次启动时,应用程序如何知道为此应用程序创建数据库

此外,在后续启动时,它是否使用Entity Framework访问身份表以进行身份​​验证?

解决方法

1)这里的进展:

当您创建一个新的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类实现一样麻烦。

猜你在找的asp.Net相关文章