代码优先配置错误

本文关键字:错误 配置 代码 | 更新日期: 2023-09-27 18:20:30

我正在尝试使用代码先行为一个简单的QA应用程序建模,以便于学习。用户应该能够提出问题,回答问题,并为问题和答案写下评论。这是我的模型类:

[Table("UserProfile")]
public class UserProfile
{
    [Key]
    [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
    public int UserId { get; set; }
    public string UserName { get; set; }
    public DateTime? BirthDate { get; set; }
    public ICollection<Gym> Gyms { get; set; }
}
[Table("Question")]
public class Question
{
    [Key]
    [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
    public int QuestionId { get; set; }
    public int UserProfileId { get; set; }
    [ForeignKey("UserProfileId")]
    public UserProfile UserProfile { get; set; }
    public string Header { get; set; }
    public string Content { get; set; }
    [DatabaseGenerated(DatabaseGeneratedOption.Computed)]
    public DateTime CreateDate { get; set; }
    public ICollection<Answer> Answers { get; set; }
    public ICollection<QuestionComment> QuestionComments { get; set; }
}
[Table("QuestionComment")]
public class QuestionComment
{
    [Key]
    [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
    public int QuestionCommentId { get; set; }
    public int UserProfileId { get; set; }
    [ForeignKey("UserProfileId")]
    public UserProfile UserProfile { get; set; }
    public int QuestionId { get; set; }
    [ForeignKey("QuestionId")]
    public Question Question { get; set; }
    [Column("Content", TypeName = "ntext")]
    public string Content { get; set; }
    [DatabaseGenerated(DatabaseGeneratedOption.Computed)]
    public DateTime CreateDate { get; set; }
}
[Table("Answer")]
public class Answer
{
    [Key]
    [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
    public int AnswerId { get; set; }
    public int UserProfileId { get; set; }
    [ForeignKey("UserProfileId")]
    public UserProfile UserProfile { get; set; }
    public int QuestionId { get; set; }
    [ForeignKey("QuestionId")]
    public Question Question { get; set; }
    [Column("Content", TypeName="ntext")]
    public string Content { get; set; }
    [DatabaseGenerated(DatabaseGeneratedOption.Computed)]
    public DateTime CreateDate { get; set; }
    public IList<AnswerComment> AnswerComments { get; set; }
}
[Table("AnswerComment")]
public class AnswerComment
{
    [Key]
    [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
    public int AnswerCommentId { get; set; }
    public int UserProfileId { get; set; }
    [ForeignKey("UserProfileId")]
    public UserProfile UserProfile { get; set; }
    public int AnswerId { get; set; }
    [ForeignKey("AnswerId")]
    public Answer Answer { get; set; }
    [Column("Content", TypeName = "ntext")]
    public string Content { get; set; }
    [DatabaseGenerated(DatabaseGeneratedOption.Computed)]
    public DateTime CreateDate { get; set; }
}

这是我的数据库上下文类:

public class TestDbContext : DbContext
{
    public TestDbContext()
        : base("DefaultConnection")
    {
    }
    public DbSet<UserProfile> UserProfiles { get; set; }
    public DbSet<Question> Questions { get; set; }
    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        base.OnModelCreating(modelBuilder);
        // After update
        modelBuilder.Entity<UserProfile>()
            .HasMany(p => p.Questions)
            .WithRequired()
            .HasForeignKey(c => c.UserProfileId)
            .WillCascadeOnDelete(false);
        modelBuilder.Entity<UserProfile>()
            .HasMany(p => p.Answers)
            .WithRequired()
            .HasForeignKey(c => c.UserProfileId)
            .WillCascadeOnDelete(false);
        modelBuilder.Entity<UserProfile>()
            .HasMany(p => p.AnswerComments)
            .WithRequired()
            .HasForeignKey(c => c.UserProfileId)
            .WillCascadeOnDelete(false);
        modelBuilder.Entity<UserProfile>()
            .HasMany(p => p.QuestionComments)
            .WithRequired()
            .HasForeignKey(c => c.UserProfileId)
            .WillCascadeOnDelete(false);
        modelBuilder.Entity<Question>()
            .HasMany(p => p.Answers)
            .WithRequired()
            .HasForeignKey(c => c.QuestionId)
            .WillCascadeOnDelete(false);
        modelBuilder.Entity<Question>()
            .HasMany(p => p.QuestionComments)
            .WithRequired()
            .HasForeignKey(c => c.QuestionId)
            .WillCascadeOnDelete(false);
        modelBuilder.Entity<Answer>()
            .HasMany(p => p.AnswerComments)
            .WithRequired()
            .HasForeignKey(c => c.AnswerId)
            .WillCascadeOnDelete(false);
        // After update
    }
}

使用上面的声明创建数据库时,我得到了以下错误:

在表"AnswerComment"上引入FOREIGN KEY约束"Answer Comment_UserProfile"可能会导致循环或多个级联路径。指定ON DELETE NO ACTION或ON UPDATE NO ACTION,或修改其他FOREIGN KEY约束。''''r''n无法创建约束。请参阅以前的错误。

我该怎么办才能解决这个问题?

提前感谢,

代码优先配置错误

尝试将其添加到您的UserProfile实体:

public virtual ICollection<AnswerComment> AnswerComments { get; set; }

然后将其添加到您的modelBuilder中,这应该可以消除问题中的错误,并且您可能必须对QuestionCommentQuestionAnswer:执行此操作

modelBuilder.Entity<AnswerComment>()
            .HasRequired(u => u.UserProfile)
            .WithMany(a => a.AnswerComments)
            .WillCascadeOnDelete(false);

您有一个表a,其中包含到另一个表B的FK。在同一时间表中,表A包含表C的FK。现在,表B和表C都包含表D的FK。

如果所有FK都被定义为删除级联,则表C中的记录可以被删除两次。这不是逻辑问题,但SQL Server不支持此选项。

若要避免此问题,请在删除时设置无操作。