无法向表中添加多个外键 - EF - Code First

时间:2013-05-01 17:04:27

标签: c# entity-framework ef-code-first

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

我得到的错误是:

参照关系将导致不允许循环引用。 [约束名称= FK_dbo.Comments_dbo.Users_UserId]

我有三个表,User,Post和Comments。利用我在该领域的有限知识,我创建了三个类。

用户

public class User
{
    [Key]
    public int UserId { get; set; }
    public string Username { get; set; }
    public string Email { get; set; }
    public string FName { get; set; }
    public string LName { get; set; }
    public DateTime JoinDate { get; set; }
    public string Password { get; set; }
    public virtual ICollection<Post> Posts { get; set; }
    public virtual ICollection<Comment> Comments { get; set; }

    public User()
    {
        Posts = new List<Post>();
    }
}

发布

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; }
}

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

2 个答案:

答案 0 :(得分:2)

您可能必须在一个或两个关系上禁用级联删除,例如User.PostsUser.Comments的关系。您必须在已覆盖的OnModelCreating DbContext 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); 中使用Fluent API执行此操作:

User

或者,您可以将UserId的关系设为可选而非必需。这就像在PostComment中使用public int? UserId { get; set; } 外键属性一样简单:

null

从业务角度来看,即使在用户被删除后,也可以将系统中的帖子和评论保持为匿名,在{{1}中由UserId Post值表示}和Comment

答案 1 :(得分:0)