Я создал класс модели, который предназначен для связи внешнего ключа с полем 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 из сгенерированной схемы таблицы?
@IvanStoev Я добавил свободные конфигурации как часть моего редактирования выше. Спасибо за вашу помощь!
По-прежнему не объясняет, откуда берутся столбцы ApplicationЯ БЫ и UserЯ БЫ. Аннотации [ForeignKey("TierForeignKey")] и [ForeignKey("UserForeignKey")] неверны, но, вероятно, EF Core игнорирует.
Почему вы хотите, чтобы он игнорировался в базе данных, но не в определении класса? Какое значение вы хотите, чтобы этот атрибут имел тогда, когда вы возвращаете объекты Execution из контекста дБ?





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