EF中朋友列表最简单的方法是什么?

时间:2013-11-25 19:23:48

标签: c# sql-server asp.net-mvc entity-framework

我想创建一个简单的朋友列表,每行有两个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约束。

我搜索过类似的问题,我看过很多外键的例子,但是,我找不到任何链接到同一个表的两个字段的例子。

1 个答案:

答案 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属性。