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

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

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

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

Не отображается какая-либо свободная конфигурация? Я спрашиваю, потому что для некоторых полей регистр не соответствует соглашениям EF - например, Id -> ID

Ivan Stoev 09.10.2018 21:45

@IvanStoev Я добавил свободные конфигурации как часть моего редактирования выше. Спасибо за вашу помощь!

SidC 09.10.2018 21:48

По-прежнему не объясняет, откуда берутся столбцы ApplicationЯ БЫ и UserЯ БЫ. Аннотации [ForeignKey("TierForeignKey")] и [ForeignKey("UserForeignKey")] неверны, но, вероятно, EF Core игнорирует.

Ivan Stoev 09.10.2018 21:54

Почему вы хотите, чтобы он игнорировался в базе данных, но не в определении класса? Какое значение вы хотите, чтобы этот атрибут имел тогда, когда вы возвращаете объекты Execution из контекста дБ?

jbooker 10.10.2018 05:37
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
4
308
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

Другие вопросы по теме