【问题标题】:How to migrate the ApplicationDbContext to the existing DbContext in ASP.NET MVC EF code-first project?如何将 ApplicationDbContext 迁移到 ASP.NET MVC EF 代码优先项目中的现有 DbContext?
【发布时间】:2017-01-04 07:33:46
【问题描述】:

我按照ASP.NET MVC tutorial 使用EF 代码优先构建了ASP.NET MVC 项目。 我已经创建了 SchoolContext 并使用 EF 代码优先为我当前的项目创建数据库。

 public class SchoolContext:DbContext
{
    public SchoolContext(DbContextOptions<SchoolContext> options) : base(options)
    {
    }

    public DbSet<Course> Courses { get; set; }
    public DbSet<Enrollment> Enrollments { get; set; }
    public DbSet<Student> Students { get; set; }
    public DbSet<Department> Departments { get; set; }
    public DbSet<Instructor> Instructors { get; set; }
    public DbSet<OfficeAssignment> OfficeAssignments { get; set; }
    public DbSet<CourseAssignment> CourseAssignments { get; set; }

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Course>().ToTable("Course");
        modelBuilder.Entity<Enrollment>().ToTable("Enrollment");
        modelBuilder.Entity<Student>().ToTable("Student");
        modelBuilder.Entity<Department>().ToTable("Department");
        modelBuilder.Entity<Instructor>().ToTable("Instructor");
        modelBuilder.Entity<OfficeAssignment>().ToTable("OfficeAssignment");
        modelBuilder.Entity<CourseAssignment>().ToTable("CourseAssignment");

        modelBuilder.Entity<CourseAssignment>()
            .HasKey(c => new { c.CourseID, c.InstructorID });
    }
}

现在我想使用 ASP.NET Identity 向这个项目添加授权功能。 我注意到我的项目中有 ApplicationDbContext,如何将 ApplicationDbContext 迁移到现有的 SchoolContext?或者我需要为 ApplicationDbContext 创建另一个数据库?

【问题讨论】:

    标签: asp.net-mvc entity-framework asp.net-identity


    【解决方案1】:

    IdentityDbContext&lt;ApplicationUser&gt; 继承 SchoolContext,然后将 aspnet 身份表添加到 modelBuilder:

     public class SchoolContext:IdentityDbContext<ApplicationUser>
     { ...
    

    OnModelCreating 方法的变化如下:

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();
            base.OnModelCreating(modelBuilder);
    
            modelBuilder.Entity<IdentityUser>()
                           .ToTable("dbo.AspNetUsers");
            modelBuilder.Entity<ApplicationUser>()
                          .ToTable("dbo.AspNetUsers");
    
            modelBuilder.Entity<IdentityRole>()
                         .ToTable("dbo.AspNetRoles");
            modelBuilder.Entity<ApplicationRole>()
                         .ToTable("dbo.AspNetRoles");
    
            modelBuilder.Entity<IdentityUserClaim>().ToTable("dbo.AspNetUserClaims");
    
            modelBuilder.Entity<IdentityUserRole>().ToTable("dbo.AspNetUserRoles");
            modelBuilder.Entity<IdentityUserRole>().HasKey((IdentityUserRole r) => new { UserId = r.UserId, RoleId = r.RoleId }).ToTable("dbo.AspNetUserRoles");
    
            modelBuilder.Entity<IdentityUserLogin>().ToTable("dbo.AspNetUserLogins");
    ...
    

    那么您应该将整个解决方案中的所有 ApplicationDbContext 替换为 SchoolContext

    【讨论】:

    • 谢谢,我从 IdentityDbContext 继承 SchoolContext 并添加 base.OnModelCreating(modelBuilder);进入我的原始代码。现在可以了。
    • 有点老了,不过你不是也要换Startup.Auth.cs吗?
    【解决方案2】:

    您可以将相同的连接字符串传递给两个 dbContext,然后两个上下文的所有表都将在同一个数据库中创建。

    您可以使用 [Authorize] 属性在您的控制器上实现授权。

    【讨论】:

    • 感谢您的回答。不过我更喜欢使用 Mostafa Esmaeili 的解决方法。
    猜你喜欢
    • 2016-05-26
    • 1970-01-01
    • 2021-03-26
    • 1970-01-01
    • 2016-03-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-08
    相关资源
    最近更新 更多