我想创建一个简单的朋友列表,每行有两个id(用户ID和朋友ID),两者都在相应用户的个人资料中引用“id”字段
| relationId |用户id | friendId |
如果双方向彼此发送友谊请求,则用户成为朋友。例如:
| 1 | 2 | 4 |
| 1 | 4 | 2 | // ID为2和4的用户是朋友
到目前为止,设置外键对我来说很容易。当我必须在同一个表中设置两个外键时,事情变得更加困难。我得到了不同的错误,我希望修复,然后重新调整我的代码,最后我觉得我太复杂了。
UserProfile模型:
[Table("UserProfile")]
public class UserProfile
{
[Key]
[DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
public int UserId { get; set; }
public string UserName { get; set; }
public string Email { get; set; }
}
朋友模特:
[Table("Friends")]
public class Friends
{
[Key]
[DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
public int RelationId { get; set; }
public int UserId { get; set; }
[ForeignKey("UserId")]
public UserProfile User { get; set; } // works with one foreign key
public int FriendId { get; set; }
[ForeignKey("FriendId")]
public UserProfile Friend { get; set; } // doesn't work when I add this one
}
这给了我以下例外:
在表'Friends'上引入FOREIGN KEY约束'Friends_User'可能会导致循环或多个级联路径。指定ON DELETE NO ACTION或ON UPDATE NO ACTION,或修改其他FOREIGN KEY约束。
我搜索过类似的问题,我看过很多外键的例子,但是,我找不到任何链接到同一个表的两个字段的例子。
答案 0 :(得分:4)
在这种情况下,异常消息告诉您有多个具有级联操作的外键。这是因为在必需的关联中,EF默认情况下在删除时实现级联。
因此,您必须从关联中删除至少一个级联操作。没有数据注释,因此您应该使用流畅的映射,例如:
modelBuilder.Entity<Friends>()
.HasRequired(p => p.User)
.WithMany()
.HasForeignKey(p => p.UserId)
.WillCascadeOnDelete(true);
modelBuilder.Entity<Friends>()
.HasRequired(p => p.Friend)
.WithMany()
.HasForeignKey(p => p.FriendId)
.WillCascadeOnDelete(false);
(在DbContext
中覆盖OnModelCreating
)。
使用此映射时,您不再需要ForeignKey
属性。