将ApplicationDbContext和DataContext合并到单个上下文中

时间:2014-01-23 15:44:15

标签: asp.net-mvc-5

我在合并这两个上下文时遇到了问题。

我从IdentityModels.cs中删除了这行代码:

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

    }
}

我在DataContext.cs

中实现了这个
  public class DataContext : DbContext
{
    public DataContext()
        : base("name=DefaultConnection")
    {
    }

    // Account tables
    public DbSet ApplicationUsers { get; set; }
    public DbSet Roles { get; set; }
    public DbSet Tokens { get; set; }
    public DbSet UserClaims { get; set; }
    public DbSet UserLogins { get; set; }
    public DbSet UserManagements { get; set; }
    public DbSet UserRoles { get; set; }
    public DbSet UserSecrets { get; set; }


    // App Models

    public DbSet<Course> Courses { get; set; }
    public DbSet<Student> Students { get; set; }

}

问题: 当我“更新数据库”时,它只创建了课程和学生表。

问题 如果我成功实现了这个方法,我将失去IdentityDbContext接口提供的所有好方法,例如:

 var rm = new RoleManager<IdentityRole>(
            new RoleStore<IdentityRole>(new ApplicationDbContext()));
        return rm.RoleExists(name);

2 个答案:

答案 0 :(得分:6)

好的,这是Olav Nybo在本主题How can one put application users in the same context as the rest of the objects?中发布的解决方案。

转到github上的示例项目:https://github.com/onybo/Asp.Net-Identity-sample-app/tree/master/CustomUser/CustomUser

从Models文件夹下载配置文件夹,并将该文件夹放在模型文件夹中。

在您的DataContext文件中,您将放置这段代码,这些代码将调用这些配置文件来构建您的数据库。

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        if (modelBuilder == null)
            throw new ArgumentNullException("modelBuilder");
               modelBuilder.Configurations.AddFromAssembly(typeof(Generic_Repo_Template.Models.Configurations.ApplicationUserConfiguration).Assembly);
    }

现在您的数据库已创建,您仍然无法通过datacontext对象访问这些表。为了能够通过datacontext访问这些表,包括以下代码行:

       public virtual IDbSet<ApplicationUser> Users { get; set; }
    public virtual IDbSet<IdentityRole> Roles { get; set; }
    public virtual IDbSet<IdentityUserClaim> Claims { get; set; }

因此完整的DataContext文件将如下所示:

public class DataContext : DbContext
{
    public DataContext()
        : base("name=DefaultConnection")
    {
    }

    // Account tables
    public virtual IDbSet<ApplicationUser> Users { get; set; }
    public virtual IDbSet<IdentityRole> Roles { get; set; }
    public virtual IDbSet<IdentityUserClaim> Claims { get; set; }

    // App Models
    public DbSet<Course> Courses { get; set; }
    public DbSet<Student> Students { get; set; }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        if (modelBuilder == null)
            throw new ArgumentNullException("modelBuilder");
        modelBuilder.Configurations.AddFromAssembly(typeof(AspNetRoleBasedSecurity.Models.Configurations.ApplicationUserConfiguration).Assembly);
    }
}

答案 1 :(得分:0)

你必须使用:

DbSet<Model> Name {get;set;}

而不是

DbSet Model {get;set;}

作为你问题的答案。 RoleStore需要一个DbContext(IdentityDbContext继承自DbContext)。所以你应该仍然可以使用roleManager等等......