Выбросы внешнего ключа EF Core Identity Имена столбцов в каждой таблице должны быть уникальными.

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

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

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 из сгенерированной схемы таблицы?


person SidC    schedule 09.10.2018    source источник
comment
Любая свободная конфигурация не показана? Я спрашиваю, потому что для некоторых полей регистр не соответствует соглашениям EF, например Id -> ID   -  person Ivan Stoev    schedule 09.10.2018
comment
@IvanStoev Я добавил свободные конфигурации как часть моего редактирования выше. Спасибо за вашу помощь!   -  person SidC    schedule 09.10.2018
comment
По-прежнему не объясняет, откуда берутся столбцы ApplicationID и UserID. Аннотации [ForeignKey("TierForeignKey")] и [ForeignKey("UserForeignKey")] неверны, но, вероятно, EF Core игнорирует их.   -  person Ivan Stoev    schedule 09.10.2018
comment
Почему вы хотите, чтобы он игнорировался в базе данных, но не в определении класса? Какое значение вы хотите, чтобы этот атрибут имел тогда, когда вы возвращаете объекты Execution из контекста dB?   -  person jbooker    schedule 10.10.2018


Ответы (1)


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

person SidC    schedule 10.10.2018