C# Can';t首先向表-EF-Code添加多个外键

C# Can';t首先向表-EF-Code添加多个外键,c#,entity-framework,ef-code-first,C#,Entity Framework,Ef Code First,我决定在EF中使用代码优先选项,但是,我遇到了一个关于单个表中多个外键的问题 我得到的错误是: 引用关系将导致不允许的循环引用。[约束名称=FK\u dbo.Comments\u dbo.Users\u UserId] 我有三个表格,用户,帖子和评论。利用我在这个领域的有限知识,我创建了三个类 使用者 “User”表中的UserId与“Post”表中的UserId之间的关系良好。但是,当我希望创建从“Comment”表到“Post”和“User”表的关系时,我遇到了问题。我不确定我做错了什么,因

我决定在EF中使用代码优先选项,但是,我遇到了一个关于单个表中多个外键的问题

我得到的错误是:

引用关系将导致不允许的循环引用。[约束名称=FK\u dbo.Comments\u dbo.Users\u UserId]

我有三个表格,用户,帖子和评论。利用我在这个领域的有限知识,我创建了三个类

使用者


“User”表中的UserId与“Post”表中的UserId之间的关系良好。但是,当我希望创建从“Comment”表到“Post”和“User”表的关系时,我遇到了问题。我不确定我做错了什么,因为每个表都连接到它们各自的Id。如果有任何帮助,我将不胜感激。

您需要配置映射:

您可能必须禁用一个或两个关系上的级联删除,例如
User.Posts
User.Comments
的关系。必须在派生的
DbContext
的模型创建
中使用Fluent API执行此操作:

modelBuilder.Entity<User>()
    .HasMany(u => u.Posts)
    .WithRequired()
    .HasForeignKey(p => p.UserId)
    .WillCascadeOnDelete(false);

modelBuilder.Entity<User>()
    .HasMany(u => u.Comments)
    .WithRequired()
    .HasForeignKey(c => c.UserId)
    .WillCascadeOnDelete(false);
甚至从业务角度来看,允许在用户被删除后将系统中的帖子和评论保持为匿名也是有意义的,由
Post
Comment
UserId
null
值表示

public class Post
{
    [Key]
    public int PostId { get; set; }
    public string Title { get; set; }
    public string Body { get; set; }
    public DateTime PublishDate { get; set; }
    public int UserId { get; set; }
    public  virtual ICollection<Comment> Comments { get; set; }

    public Post()
    {
        Comments = new List<Comment>();
    }
}
public class Comment
{
    [Key]
    public int CommentId { get; set; }
    public string Title { get; set; }
    public string Body { get; set; }
    public DateTime CommentDate { get; set; }
    public int UserId { get; set; }
    public int PostId { get; set; }
}
modelBuilder.Entity<User>()
    .HasMany(u => u.Posts)
    .WithRequired()
    .HasForeignKey(p => p.UserId)
    .WillCascadeOnDelete(false);

modelBuilder.Entity<User>()
    .HasMany(u => u.Comments)
    .WithRequired()
    .HasForeignKey(c => c.UserId)
    .WillCascadeOnDelete(false);
public int? UserId { get; set; }