EF Core Identity Foreign Key throws Имена столбцов в каждой таблице должны быть уникальными

Я создал класс модели, который должен иметь отношение внешнего ключа к полю Id в таблице Identity ASPNetUsers. Я прочитал этот SO-вопрос, который похож на мой, но я не могу решить на основе предложенного ответа.

Мой класс модели определяется как:

public class Execution
{
    [DatabaseGenerated(DatabaseGeneratedOption.Identity), Key]
    public int ExecutionId { get; set; }
    [ForeignKey("TierForeignKey")]
    public int TierID { get; set; }
    [ForeignKey("UserForeignKey")]
    public string UserId { get; set; }
    public Tier Tier { get; set; }
    public ApplicationUser User { get; set; }
}

Мой класс пользователя расширяет IdentityUser следующим образом:

 public class ApplicationUser : IdentityUser
{
    [PersonalData]
    public string Nickname { get; set; }
    [PersonalData]
    public Boolean AcceptedEula { get; set; }
    [PersonalData]
    public string TemplateSelected { get; set; }
    [PersonalData]
    public DateTime DateTimeCreated { get; set; }
    [PersonalData]
    public DateTime DateTimeLastUpdated { get; set; }
    [PersonalData]
    public string GuacamoleUrl { get; set; }
    [PersonalData]
    public string GuacamoleUserName { get; set; }
    [PersonalData]
    public string GuacamolePassword { get; set; }
    public virtual ICollection<ApplicationUserClaim> Claims { get; set; }
    public virtual ICollection<ApplicationUserLogin> Logins { get; set; }
    public virtual ICollection<ApplicationUserToken> Tokens { get; set; }
    public virtual ICollection<ApplicationUserRole> UserRoles { get; set; }
}

public class ApplicationUserRole : IdentityUserRole<string>
{
    public virtual ApplicationUser User { get; set; }
    public virtual ApplicationRole Role { get; set; }
}

public class ApplicationRole : IdentityRole
{
    public virtual ICollection<ApplicationUserRole> UserRoles { get; set; }
    public virtual ICollection<ApplicationRoleClaim> RoleClaims { get; set; }
}

public class ApplicationUserClaim : IdentityUserClaim<string>
{
    public virtual ApplicationUser User { get; set; }
}

public class ApplicationUserLogin : IdentityUserLogin<string>
{
    public virtual ApplicationUser User { get; set; }
}

public class ApplicationRoleClaim : IdentityRoleClaim<string>
{
    public virtual ApplicationRole Role { get; set; }
}

public class ApplicationUserToken : IdentityUserToken<string>
{
    public virtual ApplicationUser User { get; set; }
}

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

        modelBuilder.Entity<ApplicationUser>(b =>
        {
            b.HasMany(e => e.Claims)
                .WithOne()
                .HasForeignKey(uc => uc.UserId)
                .IsRequired();
            b.HasMany(e => e.Logins)
                .WithOne()
                .HasForeignKey(ul => ul.UserId)
                .IsRequired();
            b.HasMany(e => e.Tokens)
                .WithOne()
                .HasForeignKey(ut => ut.UserId)
                .IsRequired();
            b.HasMany(e => e.UserRoles)
                .WithOne()
                .HasForeignKey(ur => ur.UserId)
                .IsRequired();
        });

        modelBuilder.Entity<ApplicationRole>(b =>
        {
            b.HasMany(e => e.UserRoles)
                .WithOne(e => e.Role)
                .HasForeignKey(ur => ur.RoleId)
                .IsRequired();
            b.HasMany(e => e.RoleClaims)
                .WithOne(e => e.Role)
                .HasForeignKey(rc => rc.RoleId)
                .IsRequired();
        });
    }

Когда я вызываю Script-Migration из консоли диспетчера пакетов, итоговая таблица выглядит следующим образом:

CREATE TABLE [Executions] 
(
    [ExecutionID] INT NOT NULL IDENTITY,
    [UserID] INT NOT NULL,
    [TierID] INT NOT NULL,
    [UserId] NVARCHAR(450) NULL,

    CONSTRAINT [PK_Executions] PRIMARY KEY ([ExecutionID]),
    CONSTRAINT [FK_Executions_Tiers_TierID] 
        FOREIGN KEY ([TierID]) REFERENCES [Tiers] ([TierID]) 
                ON DELETE CASCADE,
    CONSTRAINT [FK_Executions_AspNetUsers_UserId] 
        FOREIGN KEY ([UserId]) REFERENCES [AspNetUsers] ([Id]) 
                ON DELETE NO ACTION
);

Как правильно опустить ошибочное поле UserID из созданной схемы таблиц?

Всего 1 ответ


Я смог решить вышеупомянутую проблему, удалив текущую миграцию с помощью консоли диспетчера пакетов и создав новую. При этом новый скрипт миграции правильно отражал мои изменения, и все работает так, как должно. Я чувствую, что была хотя бы одна, если не больше миграции, которые вызывали проблему выше. Управление миграциями EF и уход за обновлением базы данных только после просмотра сценария миграции - это мои две проблемы с этой проблемой.


Есть идеи?

10000