Identity 2.0升级后无法识别实体框架迁移历史记录?

时间:2014-10-05 17:12:33

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

我正在现有的Web项目中从Simple Membership升级到Identity 2.0。涉及实体框架的一些较大变化是DBContext继承和更改为User的UserProfiles。

我使用PMC添加迁移并更新数据库,而不是允许在运行时自动迁移。

期望在我的代码更改为获取Identity 2.0后,我将添加迁移,它将生成架构更改到我的迁移文件夹中。

由于某种原因,它不再识别当前数据库中的现有迁移历史记录表!当我运行add-migration时,它表示现有的迁移尚未应用,我应该首先运行update-database。我运行update-database -script来查看它正在尝试做什么,它想要在我的项目中创建迁移历史表和每次迁移。

似乎某种程度上不再识别迁移历史表。我运行了get-migrations来确认它正在与正确的数据库进行通信,但是没有应用任何迁移。

运行实体框架6.1.1

有什么建议吗?

 internal sealed class Configuration : DbMigrationsConfiguration<Namespace.MyContext>
{
    public Configuration()
    {
        AutomaticMigrationsEnabled = true;
        AutomaticMigrationDataLossAllowed = false;
    }

    protected override void Seed(Namespace.MyContext context)
    {
         //Stuff to initialize an empty db
    }


 public class UserProfile : IdentityUser<int, CustomIdentityUserLogin, CustomIdentityUserRole, CustomIdentityUserClaim>, IUser<int>
{
    [Required]
    public string Name { get; set; }

    public async Task<ClaimsIdentity> GenerateUserIdentityAsync(UserManager<UserProfile, int> manager)
    {
        // Note the authenticationType must match the one defined in CookieAuthenticationOptions.AuthenticationType
        var userIdentity = await manager.CreateIdentityAsync(this, DefaultAuthenticationTypes.ApplicationCookie);
        // Add custom user claims here
        return userIdentity;
    }
    //other properties related to the user profile

}

编辑2:

作为测试,我删除了migrationhistory表,运行&#34; update-database -targetmigration mostcurrentmigraiton -script&#34;,然后从脚本中删除除迁移历史记录以外的所有更改,运行脚本。 然后,我试图进行迁移,并且仍然没有将迁移应用于目标数据库&#34;出现了。我确认它确实创建了表格,并且产品版本已经更新了以前的旧版迁移。 请帮忙!

2 个答案:

答案 0 :(得分:1)

我想添加评论但是已经太长了。

第一个选项:在PCM中尝试update-database -force

第二个选项:如果这个尚未部署的网络应用程序,您还不关心数据丢失,我的回答可以提供帮助:Second attempt to generate script sql script did not work

第三种选择:我想到的还有一件事。如果使用包含Identity 2.0的模板创建新的ASP .NET MVC 5.1,则会在IdentityModels.cs中获得类Models。它看起来像这样:

namespace WebApplication2.Models {
    // You can add profile data for the user by adding more properties to your ApplicationUser class, please visit http://go.microsoft.com/fwlink/?LinkID=317594 to learn more.
    public class ApplicationUser : IdentityUser {

        PROPERTIES OF APPLICATION USER HERE


        public async Task<ClaimsIdentity> GenerateUserIdentityAsync(UserManager<ApplicationUser> manager) {
            // Note the authenticationType must match the one defined in CookieAuthenticationOptions.AuthenticationType
            var userIdentity = await manager.CreateIdentityAsync(this, DefaultAuthenticationTypes.ApplicationCookie);
            // Add custom user claims here
            return userIdentity;
        }
    }

    public class ApplicationDbContext : IdentityDbContext<ApplicationUser> {


        public ApplicationDbContext()
            : base("DefaultConnection", throwIfV1Schema: false) {
            System.Diagnostics.Debug.WriteLine("CONSTRUCTOR");
            Configuration.LazyLoadingEnabled = true;
            Configuration.ProxyCreationEnabled = true;
        }
        //stuff in database
        public DbSet<Person> Persons { get; set; }


        protected override void OnModelCreating(DbModelBuilder modelBuilder) {
            base.OnModelCreating(modelBuilder);
        }

        public static ApplicationDbContext Create() {

            return new ApplicationDbContext();

        }


    }
}

然后在Application_Start()的{​​{1}}中你有:

Global.asax

并且您的代码可能缺少来自 protected void Application_Start() { Database.SetInitializer(new MigrateDatabaseToLatestVersion<ApplicationDbContext, Configuration>()); new ApplicationDbContext().Database.Initialize(true); ...more stuff } 的这两行,但是您的Application_Start(我在这里使用了DbContext)。

如果这没有帮助,抱歉,我没有选择。

答案 1 :(得分:1)

经过多次故障排除后,我发现问题必须与安全相关。当dbcontext正在使用的连接字符串中未输入密码时,Get-Migrations将返回我看到的消息。有趣的是,使用localdb进行开发,我有正确的用户名和密码,因为更新数据库能够创建新表,但是某些访问级别不能用于获取迁移。我发现最奇怪的是,get-migrations没有说出是凭证问题!