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);
}
}
应用程序用户:
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 的任何引用替换为我的新引用。它创建了标识表,但我指定的任何 DbSet 表都没有(省略,留下一个作为示例划掉
我只是在这里猜测,因为我看不到你的代码,但我有理由确定我是对的。启动新项目时,必须启用迁移。其工作原理是,它会检查项目中派生自DbContext
的对象,然后创建一个包含Configuration.cs
文件的Migrations
文件夹。此文件显式引用用于迁移的上下文。如果您使用多个从项目中的DbContext
派生的对象执行此操作(这里,您有两个,MyContext
和 ApplicationDbContext
(,它会大惊小怪并告诉您需要指定要使用哪一个。这可能没有发生,因为您之前已使用从 Identity 生成的上下文启用了迁移,并且后来才添加了自己的上下文。
长话短,请检查此配置文件并更改其中的任何违规引用。或者,您可以完全删除Migrations
文件夹,然后在包管理器控制台中再次运行Enable-Migrations
,确保将MyContext
指定为要使用的上下文。
令人讨厌的小变化:no 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; }
}