我正在尝试配置Knowledge和ApplicationUser类之间的多对多关系。在“ add-migration”构建成功之后,但是我收到堆栈溢出。我找不到有关此问题的任何特定详细信息。
public class Question
{
[Key]
public int Id { get; set; }
public string QuestionString { get; set; }
public Knowledge Knowledge { get; set; }
}
身份用户类别
public class ApplicationUser: IdentityUser
{
public virtual ICollection<UserKnowledge> Knowledges { get; set; }
}
public class Knowledge
{
[Key]
public int Id { get; set; }
public string KnowledgeName { get; set; }
public virtual ICollection<Question> Questions { get; set; }
public virtual ICollection<UserKnowledge> Users { get; set; }
}
加入实体类
public class UserKnowledge
{
[Key]
public int Id { get; set; }
public string UserId { get; set; }
[ForeignKey("UserId")]
public ApplicationUser User { get; set; }
public int KnowledgeId { get; set; }
[ForeignKey("KnowledgeId")]
public Knowledge Knowledge { get; set; }
}
public class ApplicationDbContext : IdentityDbContext
{
public ApplicationDbContext(): base()
{}
public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options) : base(options)
{}
public DbSet<UserKnowledge> UserKnowledges { get; set; }
public DbSet<Question> Questions { get; set; }
public DbSet<Knowledge> Knowledges { get; set; }
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<UserKnowledge>()
.HasKey(ub => ub.Id);
modelBuilder.Entity<UserKnowledge>()
.HasOne(ub => ub.Knowledge)
.WithMany(u =>u.Users)
.HasForeignKey(ub => ub.KnowledgeId);
modelBuilder.Entity<UserKnowledge>()
.HasOne(ub => ub.User)
.WithMany(u => u.Knowledges)
.HasForeignKey(ub => ub.UserId);
modelBuilder.Entity<Knowledge>().HasKey(g => g.Id);
modelBuilder.Entity<Knowledge>().HasMany(q => q.Questions).WithOne(q => q.Knowledge);
modelBuilder.Entity<Question>().HasKey(g => g.Id);
OnModelCreating(modelBuilder);
}
}
有人可以告诉我我想念什么吗?
当然,具体的堆栈溢出问题是由OnModelCreating
覆盖的最后一行引起的,该行会自我调用
OnModelCreating(modelBuilder);
它应该改为调用基本方法
base.OnModelCreating(modelBuilder);
和(不相关的)IdentityDbContext
派生类,它应该是您自己的配置之前的第一行,因此您可以在需要时覆盖它的操作
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
// Your code goes here
}
两者也不相关,但是在使用自定义身份实体时,您应该真正继承其中一个泛型IdentityDbContext<...>
基类,并将您的实体类型作为泛型类型参数传递。在这种情况下,IdentityDbContext<ApplicationUser>
public class ApplicationDbContext : IdentityDbContext<ApplicationUser>
{
// ...
}
否则,EF会将模型视为使用带有鉴别符列的TPH(按层次结构表)数据库继承策略,这通常不是您期望/想要的。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句