EF核心身份外键引发每个表中的列名必须唯一

时间:2018-10-09 19:26:01

标签: c# sql-server entity-framework entity-framework-core

我创建了一个模型类,该模型类旨在与ASPNetUsers Identity表中的Id字段具有外键关系。我读了this SO question,与我的相似,但根据建议的答案我无法解决。

我的模型类定义为:

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字段?

1 个答案:

答案 0 :(得分:1)

我能够通过使用程序包管理器控制台删除当前迁移并创建一个新迁移来解决上述问题。这样,新的迁移脚本可以正确反映我的更改,并且所有脚本都可以正常工作。我认为至少有一个迁移(如果不是更多的话)导致了上述问题。我管理此问题的两个要点是管理EF迁移并仅在查看迁移脚本之后才注意更新数据库。