C# EF Core Identity外键抛出每个表中的列名必须是唯一的
我创建了一个模型类,该类旨在与ASPNetUsers标识表中的Id字段具有外键关系。我读到了与我相似的内容,但根据建议的答案我无法解决 我的模型类定义为:C# EF Core Identity外键抛出每个表中的列名必须是唯一的,c#,sql-server,entity-framework,entity-framework-core,C#,Sql Server,Entity Framework,Entity Framework Core,我创建了一个模型类,该类旨在与ASPNetUsers标识表中的Id字段具有外键关系。我读到了与我相似的内容,但根据建议的答案我无法解决 我的模型类定义为: public class Execution { [DatabaseGenerated(DatabaseGeneratedOption.Identity), Key] public int ExecutionId { get; set; } [ForeignKey("TierForeignKey")] publ
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();
});
}
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
字段?我可以通过使用package manager控制台删除当前迁移并创建一个新迁移来解决上述问题。在这样做的过程中,新的迁移脚本正确地反映了我的更改,并且一切都正常工作。我觉得至少有一次迁移(如果不是更多的话)导致了上述问题。管理EF迁移和仅在查看迁移脚本后才注意更新数据库是本期文章的两个要点。是否有任何fluent配置未显示?我这样问是因为有些字段的大小写与EF约定不匹配,比如Id
->Id
@IvanStoev,我在上面的编辑中添加了fluent配置。谢谢你的帮助!仍然没有解释ApplicationID和UserID列的来源。[ForeignKey(“TierForeignKey”)]
和[ForeignKey(“UserForeignKey”)]
注释不正确,但可能被EF Core忽略。为什么希望在数据库中忽略它,而不在类定义中?当您从dB上下文返回执行对象时,希望该属性具有什么值?