代码之家  ›  专栏  ›  技术社区  ›  SidC

EF核心标识外键抛出每个表中的列名必须唯一

  •  0
  • SidC  · 技术社区  · 6 年前

    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 回复  |  直到 6 年前
        1
  •  1
  •   SidC    6 年前

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