Създадох клас модел, който е предназначен да има връзка с външен ключ с полето 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
от генерираната схема на таблица?
Id
-›ID
- person Ivan Stoev   schedule 09.10.2018[ForeignKey("TierForeignKey")]
и[ForeignKey("UserForeignKey")]
са неправилни, но вероятно се игнорират от EF Core. - person Ivan Stoev   schedule 09.10.2018