不能在一个表中添加多个外键- EF -代码优先

本文关键字:EF 代码 一个 不能 添加 | 更新日期: 2023-09-27 18:11:37

我决定在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; }
}

'User'表中的UserId和'Post'表中的UserId之间的关系是好的。然而,当我希望创建从"评论"表到"帖子"answers"用户"表的关系时,我遇到了问题。我不确定我做错了什么,因为每个表都连接到各自的Id。

不能在一个表中添加多个外键- EF -代码优先

您可能必须在一个或两个关系上禁用级联删除,例如对于User.PostsUser.Comments的关系。您必须在派生的DbContext的覆盖OnModelCreating中使用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);

或者,您可以将与User的关系设置为可选的而不是必需的。这就像将PostComment中的UserId外键属性设置为空一样简单:

public int? UserId { get; set; }

从业务角度来看,允许在系统中保持帖子和评论的匿名性,即使在用户被删除之后,也可能是有意义的,用PostComment中的null值为UserId来表示。

您需要配置您的映射:http://www.remondo.net/code-first-fluent-api-entity-type-configuration/