每次我在软件包管理器控制台中运行命令Add-Migration -Context ApplicationDbContext
时,迁移似乎都试图创建另一个DbContext中已经存在的表。
我具有以下项目结构:
我要创建的表是CheckoutToken
模型:
public class CheckoutToken
{
[Key]
public string Token { get; set; }
public string UserId { get; set; }
public int LicenseId { get; set; }
public DateTime Created { get; set; }
public DateTime Expires { get; set; }
public License License { get; set; }
public virtual ApplicationUser User { get; set; }
}
ApplicationUser
模型是一个存在的表,这是该模型:
public class ApplicationUser : IdentityUser
{
public bool SmsTwoFactorEnabled { get; set; }
}
当我运行Add-Migration命令时,我得到了一个迁移,看起来它正在尝试在Up()
方法中创建一个名为“ ApplicationUser”的表,如下所示:
migrationBuilder.CreateTable(
name: "ApplicationUser",
columns: table => new
{
Id = table.Column<string>(nullable: false),
UserName = table.Column<string>(nullable: true),
NormalizedUserName = table.Column<string>(nullable: true),
Email = table.Column<string>(nullable: true),
NormalizedEmail = table.Column<string>(nullable: true),
EmailConfirmed = table.Column<bool>(nullable: false),
PasswordHash = table.Column<string>(nullable: true),
SecurityStamp = table.Column<string>(nullable: true),
ConcurrencyStamp = table.Column<string>(nullable: true),
PhoneNumber = table.Column<string>(nullable: true),
PhoneNumberConfirmed = table.Column<bool>(nullable: false),
TwoFactorEnabled = table.Column<bool>(nullable: false),
LockoutEnd = table.Column<DateTimeOffset>(nullable: true),
LockoutEnabled = table.Column<bool>(nullable: false),
AccessFailedCount = table.Column<int>(nullable: false),
SmsTwoFactorEnabled = table.Column<bool>(nullable: false)
},
constraints: table =>
{
table.PrimaryKey("PK_ApplicationUser", x => x.Id);
});
我不确定我在做什么错,我以为EF会知道ApplicationUser是AspNetUsers
表,并且通过链接具有来自CheckoutToken
的外键关系,它将知道这是一个依赖关系,而不是一个新表。
我的DbContext中也没有ApplicationUser表作为DbSet:
public class ApplicationDbContext : DbContext
{
public DbSet<LicenseType> LicenseTypes { get; set; }
public DbSet<License> Licenses { get; set; }
public DbSet<CheckoutToken> CheckoutTokens { get; set; }
public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options)
: base(options)
{ }
protected override void OnModelCreating(ModelBuilder builder)
{
builder.SeedEnumValues<LicenseType, LicenseTypeEnum>(e => e);
}
}
有人知道我在做什么错吗?我已经困惑了好几天了
答案 0 :(得分:0)
由于在您的应用程序中有两个数据库上下文(IdentityDbContext和ApplicationDbContext),也许它们正在使用不同的数据库来存储表。您可以检查Startup.cs或IdentityHostingStartup.cs文件中的ConfigureServices方法,确保它们使用相同的连接字符串。
services.AddDbContext<ApplicationDbContext>(options =>
options.UseSqlServer(
Configuration.GetConnectionString("IndentityDbContextConnection")));
services.AddDbContext<IndentityDbContext>(options =>
options.UseSqlServer(
Configuration.GetConnectionString("IndentityDbContextConnection")));
此外,对于ApplicationDbContext,请尝试如下修改代码:
public class ApplicationDbContext : IdentityDbContext<ApplicationUser>
{
然后,启用迁移以检查结果。
编辑:
如果仍然无法正常运行,请尝试删除Up()和Down()方法中不必要的语句。
此外,如果遇到未添加到AspNetUsers问题的新属性,请尝试在Up()/ Down()方法中添加以下代码,例如(使用以下代码在AspNetUsers表中添加“地址”列) ,然后,使用迁移更新数据库):
protected override void Up(MigrationBuilder migrationBuilder)
{
migrationBuilder.AddColumn<int>(
name: "Address",
table: "AspNetUsers",
nullable: false,
defaultValue: 0);
}
protected override void Down(MigrationBuilder migrationBuilder)
{
migrationBuilder.DropColumn(
name: "Address",
table: "AspNetUsers");
}