在不同项目中使用模型进行EF迁移

时间:2020-10-01 12:36:03

标签: c# entity-framework asp.net-core migration

每次我在软件包管理器控制台中运行命令Add-Migration -Context ApplicationDbContext时,迁移似乎都试图创建另一个DbContext中已经存在的表。

我具有以下项目结构:

enter image description here

我要创建的表是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);
        }
    }

有人知道我在做什么错吗?我已经困惑了好几天了

1 个答案:

答案 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");
    }