不能在一个表中添加多个外键- 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。
您可能必须在一个或两个关系上禁用级联删除,例如对于User.Posts
和User.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
的关系设置为可选的而不是必需的。这就像将Post
和Comment
中的UserId
外键属性设置为空一样简单:
public int? UserId { get; set; }
从业务角度来看,允许在系统中保持帖子和评论的匿名性,即使在用户被删除之后,也可能是有意义的,用Post
和Comment
中的null
值为UserId
来表示。
您需要配置您的映射:http://www.remondo.net/code-first-fluent-api-entity-type-configuration/