public class MyContext: IdentityDbContext<ApplicationUser>
{
public MyContext()
: base("MyContext", throwIfV1Schema: false)
{
}
public static MyContext Create()
{
return new MyContext();
}
public System.Data.Entity.DbSet<xxxx> xxxxx { get; set; }
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
}
}
Startup.Auth:
public void ConfigureAuth(IAppBuilder app)
{
// Configure the db context and user manager to use a single instance per request
app.CreatePerOwinContext(MyContext.Create); // ALTERED THIS
app.CreatePerOwinContext<ApplicationUserManager>(ApplicationUserManager.Create); // ALTERED THIS
app.UseCookieAuthentication(new CookieAuthenticationOptions
{
AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie,
LoginPath = new PathString("/Account/Login"),
Provider = new CookieAuthenticationProvider
{
OnValidateIdentity = SecurityStampValidator.OnValidateIdentity<ApplicationUserManager, ApplicationUser>(
validateInterval: TimeSpan.FromMinutes(30),
regenerateIdentity: (manager, user) => user.GenerateUserIdentityAsync(manager))
}
});
app.UseExternalSignInCookie(DefaultAuthenticationTypes.ExternalCookie);
}
}
ApplicationUser:
public class ApplicationUser : IdentityUser
{
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;
}
}
// this is the old code, no longer referenced in startup.auth:
public class ApplicationDbContext : IdentityDbContext<ApplicationUser>
{
public ApplicationDbContext()
: base("MyContext", throwIfV1Schema: false)
{
}
public static ApplicationDbContext Create()
{
return new ApplicationDbContext();
}
}
所以基本上,我将我的新上下文设置为从IdentityDbContext继承,并用我的新引用替换旧的ApplicationDbContext的任何引用。它创建了Identity表,但是我没有指定任何DbSet表(省略,左边一个用于样本
答案 0 :(得分:1)
我只是在这里猜测,因为我无法看到你的代码,但我确信我是正确的。启动新项目时,必须启用迁移。这是如何工作的,它检查您的项目是否从DbContext
派生的对象,然后创建一个Migrations
文件夹,其中包含Configuration.cs
文件。此文件显式引用用于迁移的上下文。如果您在项目中使用从DbContext
派生的多个对象执行此操作(此处,您有两个,MyContext
和ApplicationDbContext
),它会对您大惊小怪并告诉您需要指定使用哪一个。这可能不会发生,因为您之前已使用Identity生成的上下文启用了迁移,并且之后才添加了您自己的上下文。
多长时间,检查此配置文件并更改任何有问题的引用。或者,您可以完全删除Migrations
文件夹并在包管理器控制台中再次运行Enable-Migrations
,确保将MyContext
指定为要使用的上下文。
答案 1 :(得分:0)
恼人的小变化: 没有throwIfV1Schema:false
public class MyContext: IdentityDbContext<ApplicationUser>
{
public MyContext() : base("MyContext")
{
}
public static MyContextCreate()
{
return new MyContext();
}
public System.Data.Entity.DbSet<xxx> xxx{ get; set; }
}