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