【问题标题】:Many-to-Many Relationships to Same Table with EF使用 EF 到同一张表的多对多关系
【发布时间】:2013-10-27 08:20:47
【问题描述】:

我有一张桌子,我需要多对多的关系,一个例子可以是保持友谊的社交网络。例如:

public class User
{
    public int UserId { get; set; }
    public string UserName { get; set; }
}

对应表

CREATE TABLE Users (
UserId int,
UserName varchar(255)
);

我需要一张这样的桌子:

CREATE TABLE Friendships(
UserId1 int,
UserId2 int
);

这两个字段都与Users.UserId 相关。如何通过 EF 中的注释实现这一点?

【问题讨论】:

    标签: c# .net entity-framework linq-to-entities


    【解决方案1】:

    这样就可以了

    public class User
    {
        public int UserId { get; set; }
        public string UserName { get; set; }
    
        public ICollection<User> FriendShips { get; set; }
        public User()
        {
            FriendShips = new HashSet<User>();
        }
    }
    
    
    public class SocialContext : DbContext
    {
        public DbSet<User> Users { get; set; }
    
        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            base.OnModelCreating(modelBuilder);
    
            modelBuilder.Entity<User>()
            .HasMany(p => p.FriendShips)
            .WithMany()
            .Map(mc =>
            {
    
                mc.ToTable("userfriends");
            });
        }
    }
    

    每个用户的单个列表将保留每个用户的朋友列表

    测试:

        using (SocialContext ctx = new SocialContext())
        {
            User u = new User()
            {
                UserName = "John"
            };
    
            User uu = new User()
            {
                UserName = "Jack"
            };
    
            uu.FriendShips.Add(u);
            u.FriendShips.Add(uu);
    
            ctx.Users.Add(u);
    
            ctx.SaveChanges();
        }
    

    【讨论】:

    • 为什么只有一个列表友谊而不是两个?
    【解决方案2】:

    试试这个解决方案

        public class User
    {
        public int UserId { get; set; }
        public string UserName { get; set; }
        public virtual ICollection<User> MyFriends { get; set; }
    
        public virtual ICollection<User> IFriendsForUsers { get; set; }
    
    }
    

    在 EFDBContext 类中:DbContext

      protected override void OnModelCreating(DbModelBuilder modelBuilder)
            {                
               modelBuilder.Entity<User>().HasMany(t => t.Friends )
              .WithMany(t => t.IFriendsForUsers )
              .Map(c => { c.ToTable("UserFriends"); 
               c.MapLeftKey("UserId"); c.MapRightKey("UserFriendId"); });
    
              base.OnModelCreating(modelBuilder);
            } 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-02-17
      • 2012-08-27
      • 2020-09-09
      • 2015-11-12
      • 2019-10-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多