【问题标题】:Converting MVC4 Dbcontext to MVC5 ApplicationDbContext将 MVC4 Dbcontext 转换为 MVC5 ApplicationDbContext
【发布时间】:2016-03-26 22:43:34
【问题描述】:

我目前正在使用 Identity 克隆 MVC5。我之前正在编写一个 MVC4 Code First Entity Framework 应用程序,并且由于 Identitiy 的原因想将其升级到 MVC5。我目前正在尝试添加一个控制器,但我需要选择一个数据上下文类。在 MVC4 中,我创建了一个名为 Issue Context 的 dbcontext,并且想知道如何转换它以使其与 ApplicationDbContext(MVC5) 兼容

MVC4 中的IssueContext.cs

public class IssueContext : DbContext
{
    public DbSet<User> Users { get; set; }
    public DbSet<Ticket> Tickets { get; set; }
    public DbSet<Category> Categories { get; set; }
    public DbSet<Department> Departments { get; set; }
    public DbSet<Depot> Depots { get; set; }


    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();

    }
}

IdentitiyModels.cs 中的 ApplicationdbContext

public class ApplicationDbContext : IdentityDbContext<ApplicationUser>
{
    public ApplicationDbContext()
        : base("DefaultConnection", throwIfV1Schema: false)
    {
    }

    static ApplicationDbContext()
    {
        Database.SetInitializer<ApplicationDbContext>(new ApplicationDbInitializer());
    }

    public static ApplicationDbContext Create()
    {
        return new ApplicationDbContext();
    }
}

更新了 MV5 ApplicationDBContext.cs

public class ApplicationUser : IdentityUser
{
    public async Task<ClaimsIdentity> 
        GenerateUserIdentityAsync(UserManager<ApplicationUser> manager)
    {
        var userIdentity = await manager
            .CreateIdentityAsync(this, DefaultAuthenticationTypes.ApplicationCookie);
        return userIdentity;
    }

    public int UserID { get; set; } <---We don't need this right?

    public bool IsAdministrator { get; set; }
    [StringLength(50, MinimumLength = 1)]
    public string LastName { get; set; }
    [StringLength(50, MinimumLength = 1, ErrorMessage = "First name cannot be longer than 50 characters.")]

    [Column("FirstName")]
    public string FirstMidName { get; set; }

    public string FullName
    {
        get { return FirstMidName + " " + LastName; }
    }
    [DataType(DataType.Date)]
    [DisplayFormat(DataFormatString = "{0:yyyy-MM-dd}", ApplyFormatInEditMode = true)]
    public DateTime EnrollmentDate { get; set; }

    public int DepartmentID { get; set; }
    [ForeignKey("DepartmentID")]
    public virtual Department Department { get; set; }
    public int DepotID { get; set; }
    [ForeignKey("DepotID")]
    public virtual Depot Depot { get; set; }
    public virtual ICollection<Ticket> Tickets { get; set; }
}


public class ApplicationRole : IdentityRole
{
    public ApplicationRole() : base() { }
    public ApplicationRole(string name) : base(name) { }
    public string Description { get; set; }

}


public class ApplicationDbContext : IdentityDbContext<ApplicationUser>
{
    public ApplicationDbContext()
        : base("DefaultConnection", throwIfV1Schema: false)
    {
    }


    public DbSet<Ticket> Tickets { get; set; }
    public DbSet<Category> Categories { get; set; }
    public DbSet<Department> Departments { get; set; }
    public DbSet<Depot> Depots { get; set; }

    static ApplicationDbContext()
    {
        Database.SetInitializer<ApplicationDbContext>(new ApplicationDbInitializer());
    }

    public static ApplicationDbContext Create()
    {
        return new ApplicationDbContext();
    }
}

}

【问题讨论】:

    标签: c# entity-framework asp.net-mvc-4 dbcontext


    【解决方案1】:

    您需要让 User 类从 IdentityUser 继承,然后删除用户数据集,而其他数据集保持不变。

    public class ApplicationDbContext : IdentityDbContext<User>
    {
    public ApplicationDbContext()
        : base("DefaultConnection")
    {
    }
    
    public DbSet<Ticket> Tickets { get; set; }
    public DbSet<Category> Categories { get; set; }
    public DbSet<Department> Departments { get; set; }
    public DbSet<Depot> Depots { get; set; }
    
    static ApplicationDbContext()
    {
        Database.SetInitializer<ApplicationDbContext>(new ApplicationDbInitializer());
    }
    
    public static ApplicationDbContext Create()
    {
        return new ApplicationDbContext();
    }
    }
    
    
    public class User : IdentityUser{
    
      // other properties
    }
    

    【讨论】:

    • 我重新编辑了问题并添加了更新版本。我们是这样的吗??我们不需要 UserID,因为 IdentityUser 对吗?
    【解决方案2】:

    IdentityDbContext 继承 DbContext。您只需将原始上下文中的 DbSet 添加到 ApplicationDbContext。但是,您可以使用两个单独的上下文,这样您就不会让身份工具混淆您的数据库。

    【讨论】:

    • 所以当我添加一个控制器时,我只是将它重定向到我的 IssueContext?
    猜你喜欢
    • 2016-07-15
    • 2020-10-13
    • 1970-01-01
    • 1970-01-01
    • 2012-10-04
    • 2013-02-05
    • 1970-01-01
    • 1970-01-01
    • 2012-03-23
    相关资源
    最近更新 更多