我决定使用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。任何帮助将不胜感激。
答案 0 :(得分:2)
您可能必须在一个或两个关系上禁用级联删除,例如User.Posts
和User.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
的关系设为可选而非必需。这就像在Post
和Comment
中使用public int? UserId { get; set; }
外键属性一样简单:
null
从业务角度来看,即使在用户被删除后,也可以将系统中的帖子和评论保持为匿名,在{{1}中由UserId
Post
值表示}和Comment
。
答案 1 :(得分:0)