EF Core Identity Чужд ключ хвърля Имената на колони във всяка таблица трябва да бъдат уникални

Създадох клас модел, който е предназначен да има връзка с външен ключ с полето Id в таблицата за идентичност на 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 от генерираната схема на таблица?


person SidC    schedule 09.10.2018    source източник
comment
Някаква плавна конфигурация не е показана? Питам, защото за някои полета корпусът не съответства на EF конвенциите - като Id -› ID   -  person Ivan Stoev    schedule 09.10.2018
comment
@IvanStoev Добавих fluent конфигурациите като част от моята редакция по-горе. Благодаря за вашата помощ!   -  person SidC    schedule 09.10.2018
comment
Все още не обяснява откъде идват колоните ApplicationID и UserID. Анотациите [ForeignKey("TierForeignKey")] и [ForeignKey("UserForeignKey")] са неправилни, но вероятно се игнорират от EF Core.   -  person Ivan Stoev    schedule 09.10.2018
comment
Защо искате да го игнорирате в базата данни, но не и в дефиницията на класа? Каква стойност бихте искали да има този атрибут, когато върнете обектите за изпълнение от dB контекста?   -  person jbooker    schedule 10.10.2018


Отговори (1)


Успях да разреша горния проблем, като премахнах текущата миграция с помощта на конзолата на мениджъра на пакети и създадох нова. По този начин новият скрипт за миграция отразява промените ми правилно и всичко работи както трябва. Чувствам, че имаше поне една, ако не и повече миграции, които причиняваха проблема по-горе. Управлението на EF миграции и грижата за актуализиране на базата данни само след преглед на скрипта за миграция са моите два извода от този проблем.

person SidC    schedule 10.10.2018