我正在现有的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;出现了。我确认它确实创建了表格,并且产品版本已经更新了以前的旧版迁移。 请帮忙!
答案 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没有说出是凭证问题!