我在合并这两个上下文时遇到了问题。
我从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);
答案 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等等......