首页 > 解决方案 > 如何在 asp.net-core 中使用代码优先迁移来删除唯一约束

问题描述

我有一个项目,我为其添加了一个带有外键的初始迁移,如下所示:

 public class ApplicationUser : IdentityUser 
 {
  public string RegistrarId { get; set; }
 
  [ForeignKey("RegistrarId")]
  public virtual ApplicationUser Registrar { get; set; }

 }

但是,我意识到,当我运行代码优先迁移时,它会自动在 Registrar 列上创建一个唯一索引,这违背了我的意愿。

 migrationBuilder.CreateIndex(
            name: "IX_AspNetUsers_RegistrarId",
            table: "AspNetUsers",
            column: "RegistrarId",
            unique: true,
            filter: "[RegistrarId] IS NOT NULL");

我的问题是,有没有办法修改我的类以通过另一个迁移来消除这个约束。

以下是我对 ApplicationUser 实体 onModelCreating 的内容

 protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        base.OnModelCreating(modelBuilder);

        modelBuilder.Entity<ApplicationUser>(b =>
        {
            // Each User can have many UserClaims
            b.HasMany(e => e.Claims)
                .WithOne(e => e.User)
                .HasForeignKey(uc => uc.UserId)
                .IsRequired();

            // Each User can have many UserLogins
            b.HasMany(e => e.Logins)
                .WithOne(e => e.User)
                .HasForeignKey(ul => ul.UserId)
                .IsRequired();

            // Each User can have many UserTokens
            b.HasMany(e => e.Tokens)
                .WithOne(e => e.User)
                .HasForeignKey(ut => ut.UserId)
                .IsRequired();

            // Each User can have many entries in the UserRole join table
            b.HasMany(e => e.UserRoles)
                .WithOne(e => e.User)
                .HasForeignKey(ur => ur.UserId)
                .IsRequired();

            b.HasIndex(e => e.Email)
                .IsUnique();             
        });

我的应用程序在带有 EF-Core 3.1 和 SQLServer 的 ASP.NET-Core 3.1 上

请帮忙谢谢

标签: c#sql-serverasp.net-coreentity-framework-core

解决方案


您很可能在OnModelCreating. 如果你这样做,只需将其翻转为假。

protected override void OnModelCreating(ModelBuilder builder)
{
    builder.Entity<ApplicationUser>()
        .HasIndex(x => x.RegistrarId)
        .IsUnique(false);

    base.OnModelCreating(builder);
}

它将生成“删除和创建”索引迁移,但没有唯一属性

protected override void Up(MigrationBuilder migrationBuilder)
{
    migrationBuilder.DropIndex(
        name: "IX_AspNetUsers_RegistrarId",
        table: "AspNetUsers");

    migrationBuilder.CreateIndex(
        name: "IX_AspNetUsers_RegistrarId",
        table: "AspNetUsers",
        column: "RegistrarId");
}

推荐阅读