C# 在实体框架中具有相同对象的列表

C# 在实体框架中具有相同对象的列表,c#,entity-framework,foreign-keys,relational-database,C#,Entity Framework,Foreign Keys,Relational Database,我正在设计一个使用实体框架的代码火迁移,当一个对象的列表与它自己的类型相同时,我会遇到一些问题。假设我有一个用户对象,它有一个列表作为它的朋友: public class User { [Key] public int UserId { get; set; } // some other stuff public List<User> Friends { get; set; } } 我试图避免将UserId同时作为键和外键,因此这里有什么好的做法

我正在设计一个使用实体框架的代码火迁移,当一个对象的列表与它自己的类型相同时,我会遇到一些问题。假设我有一个
用户
对象,它有一个
列表
作为它的
朋友

public class User
{
    [Key]
    public int UserId { get; set; }

    // some other stuff

    public List<User> Friends { get; set; }
}

我试图避免将
UserId
同时作为键和外键,因此这里有什么好的做法?

您不能在实体框架中对相关集合使用
List
。它必须是
虚拟ICollection

这里最好有一个单独的表

姓名:UserFriend PK:UserFriendId FK:UserId
FK:FriendId

UserId
不能是外键,它是一对多关系。您需要一个单独的用户朋友表,其中包含将用户id与其朋友id连接的条目。您需要为朋友和用户创建单独的表。在您的案例中,EntityFramework试图找出用于构建关系的外键。它从同一个表中找到唯一的主键UserId。您无法避免它。尝试了虚拟ICollection并得到了相同的结果。这不是真的。您可以使用
列表
。我不说这是推荐的,但这是可能的。而且它不必是虚拟的。
AddColumn("dbo.Users", "User_UserId", c => c.Int());