1

Я строю социальную сеть с функцией Friend. Моя идея заключается в том, что я уже был класс по ApplicationUser по умолчанию, поэтому я создаю новую таблицу под названием ДругEntity Framework code-first, отношения Many-to-Many в одной таблице

public class Friend 
{ 
    [Key] 
    [Column(Order = 1)] 
    public string SenderId { get; set; } 

    [Key] 
    [Column(Order = 2)] 
    public string ReceiverId { get; set; } 

    //Status == true : Friend request accepted 
    //Status == false : Friend request not accepted 
    public bool Status { get; set; } 
} 

В ApplicationUser, я определяю 2 навигационные свойства Отправители и ресиверы (связать друг таблицу)

public class ApplicationUser : IdentityUser 
{ 
    [Required] 
    [StringLength(50)] 
    public string Name { get; set; } 

    [Required] 
    public bool Gender { get; set; } 

    [StringLength(255)] 
    public string Address { get; set; } 

    [StringLength(255)] 
    public string Job { get; set; } 

    [StringLength(255)] 
    public string Image { get; set; } 

    public DateTime Birthday { get; set; } 

    public ICollection<ApplicationUser> Senders { get; set; } 
    public ICollection<ApplicationUser> Receivers { get; set; } 
} 

И, наконец, в ApplicationDbContext, я объявляю отношение между 2 таблицами с использованием топочного нт Api

public class ApplicationDbContext : IdentityDbContext<ApplicationUser> 
{ 

    public DbSet<Friend> Friends { get; set; } 

    public ApplicationDbContext() 
     : base("DefaultConnection", throwIfV1Schema: false) 
    { 
    } 

    public static ApplicationDbContext Create() 
    { 
     return new ApplicationDbContext(); 
    } 

    protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 
     modelBuilder.Entity<ApplicationUser>() 
      .HasMany(a => a.Senders) 
      .WithMany(a => a.Receivers) 
      .Map(m => 
      { 
       m.MapLeftKey("ReceiverId"); 
       m.MapRightKey("SenderId"); 
       m.ToTable("Friends"); 
      }); 
     base.OnModelCreating(modelBuilder); 

    } 
} 

Но когда я добавляю миграцию, это создает 2 таблицы, как это, и ни один из них является то, что мне нужно (один не имеет внешних ключей, один не имеет свойства состояния)

public override void Up() 
    { 
     CreateTable(
      "dbo.Friends1", 
      c => new 
       { 
        SenderId = c.String(nullable: false, maxLength: 128), 
        ReceiverId = c.String(nullable: false, maxLength: 128), 
        Status = c.Boolean(nullable: false), 
       }) 
      .PrimaryKey(t => new { t.SenderId, t.ReceiverId }); 

     CreateTable(
      "dbo.Friends", 
      c => new 
       { 
        SenderId = c.String(nullable: false, maxLength: 128), 
        ReceiverId = c.String(nullable: false, maxLength: 128), 
       }) 
      .PrimaryKey(t => new { t.SenderId, t.ReceiverId }) 
      .ForeignKey("dbo.AspNetUsers", t => t.SenderId) 
      .ForeignKey("dbo.AspNetUsers", t => t.ReceiverId) 
      .Index(t => t.SenderId) 
      .Index(t => t.ReceiverId); 

    } 

Что я должен делать :(Я искал в Интернете, и это кажется законным, но он не работает

ответ

1

но когда я добавляю миграцию, это создает 2 таблицы, как это, и ни один из них не является тем, что мне нужно (у одного нет внешних ключей, т имеют свойство состояния)

Это происходит потому, что вы смешали два возможных many-to-many ассоциаций, поддерживаемых EF - один с использованием неявной распределительной таблицы (из конфигурации Fluent API), а другая с помощью явного перехода таблицы (Friend лица) и два one-to-many ассоциации.

Поскольку первый подход может быть использован только в том случае, если у вас нет дополнительных данных, связанных с ассоциацией, и у вас есть одно свойство (Status), вам необходимо использовать второй подход.

Для того, чтобы сделать это, изменить тип навигационных свойств следующим образом:

public class ApplicationUser : IdentityUser 
{ 
    // ... 
    public ICollection<Friend> Senders { get; set; } 
    public ICollection<Friend> Receivers { get; set; } 
} 

и конфигурации:

modelBuilder.Entity<ApplicationUser>() 
    .HasMany(e => e.Senders) 
    .WithRequired() 
    .HasForeignKey(e => e.ReceiverId); 

modelBuilder.Entity<ApplicationUser>() 
    .HasMany(e => e.Receivers) 
    .WithRequired() 
    .HasForeignKey(e => e.SenderId); 
+0

Вы только что спас мой день, спасибо !! – LaXuanLinh

+0

Еще один вопрос, как я могу получить список друзей одного пользователя? – LaXuanLinh

+0

Мне нужен список ApplicationUser, которые являются друзьями другого ApplicationUser. Поэтому я передаю его идентификатор и запрос, как указано ниже: – LaXuanLinh