Как я могу установить мои отношения модели, чтобы сделать следующее в. NET Core 3.1 & EF - PullRequest
0 голосов
/ 10 марта 2020

Я нахожусь в процессе обучения. NET Core 3.1 и EF и решили начать свой собственный проект. Я хотел настроить свои модели так, чтобы я мог создать следующие отношения:

Пользователь -1-to-Many-> Событие -1-to-many-> EventMember -1-to-many-> Пользователь

Я создал Событие API для проверки своих изменений, но мне не повезло.

Я представлял JSON токен выглядит следующим образом:

"Event" {
        "id" :
        "name" :
        "userId" :
        "eventMember" : {
                          "id" :
                          "eventId" : 
                          "UserId" :
                          "user" : {
                                    "id" :
                                    "name" :
                                   }
                                   {
                                    "id" :
                                    "name" :
                                   }
                                   {
                                    "id" :
                                    "name" :
                                   }

                        }

                        {
                          "id" :
                          "eventId" : 
                          "user" : {
                                    "id" :
                                    "name" :
                                   }
                                   {
                                    "id" :
                                    "name" :
                                   }
                                   {
                                    "id" :
                                    "name" :
                                   } 


                        }



       }

User.cs

User {

public int Id {Get; Set;}
public string Name{Get; Set;}

public ICollection<Event> Event {Get; Set;}

}

Event.cs

Event {

public int Id {Get; Set;}
public string Name{Get; Set;}

public int UserId {Get; Set;}
public User User {Get; Set;}

public ICollection<EventMember> EventMember {Get; Set;}

}

EventMember.cs

EventMember {

public string Id {Get; Set;}
public string Name{Get; Set;}

//This is where I'm not sure How I would go about the relationship to User
public User User {Get; Set;}

}

Вот мои вопросы:

  1. Здесь есть круговая зависимость, это плохая практика?
  2. Было бы лучше сохранить Пользователь независимым от других моделей и просто заполнить userId в таблице событий вручную в контроллере?
  3. Если я получу настройку отношений правильно, когда я вызываю мой Event API, EF будет возвращать результат с другими вложенными объектами, такими как EventMember и User, автоматически, или это то, что мне нужно заполнить вручную, например: event.EventMember = _eventMemberRepository.FirstOfDefault(MyEventMemberId); //Something like that, basically call the repo to get the object and populate it in the parent object

Но самое главное, как правильно настроить модели для этих отношений в EF? Любая помощь очень ценится. Спасибо всем.

Ответы [ 2 ]

1 голос
/ 11 марта 2020

Исходя из ваших требований, я думаю, что отношения между пользователем, Event и EventMember: User и EventMember (многие-ко-многим), Event и EventMember (один-ко-многим). Ниже приведена демонстрационная версия:

Модель и DbContext

  public class User
{
    public int Id { get; set; }
    public string Name { get; set; }

    public ICollection<UserEventMember> UserEventMembers { get; set; }
}

public class UserEventMember
{
    public int UserId { get; set; }
    public User User { get; set; }

    public string EventMemberId { get; set; }
    public EventMember EventMember { get; set; }
}
public class EventMember
{
    public string Id { get; set; }
    public string Name { get; set; }

    public int EventId { get; set; }
    public Event Event { get; set; }
    public ICollection<UserEventMember> UserEventMembers { get; set; }

}
public class Event
{
    public int Id { get; set; }
    public string Name { get; set; }

    public ICollection<EventMember> EventMember { get; set; }
}

public class MVCDbContext:DbContext
{
    public MVCDbContext(DbContextOptions<MVCDbContext> options):base(options)
    { }

    public DbSet<User> User { get; set; }
    public DbSet<Event> Event { get; set; }
    public DbSet<EventMember> EventMember { get; set; }

   protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.Entity<UserEventMember>()
            .HasKey(ue => new { ue.UserId,ue.EventMemberId});

        modelBuilder.Entity<UserEventMember>()
            .HasOne(ue=>ue.User)
            .WithMany(u => u.UserEventMembers)
            .HasForeignKey(ue=>ue.UserId);

        modelBuilder.Entity<UserEventMember>()
            .HasOne(ue => ue.EventMember)
            .WithMany(e => e.UserEventMembers)
            .HasForeignKey(ue => ue.EventMemberId);
    }
}

Контроллер, используйте метод Включить , чтобы указать связанные данные, которые будут включены в результаты запроса.

 public IActionResult GetEventData()
    {
        var model = _context.Event
            .Include(e => e.EventMember)
                .ThenInclude(em => em.UserEventMembers)
                .ThenInclude(ue => ue.User)
            .Select(e=>new { 
                Id=e.Id,
                Name=e.Name,
                EventMember=e.EventMember.Select(em=>new { 
                    em.Id,em.Name,em.EventId,
                    User=em.UserEventMembers.Select(ue=>new { 
                        Id=ue.UserId ,
                        Name=ue.User.Name
                    }).ToList(),
                }).ToList()
            })
            .ToList();
        return Json(model);
    }

Результат: enter image description here

1 голос
/ 11 марта 2020

то, что вы описываете, является отношением «многие ко многим» между событием и пользователем
, вы можете прочитать больше здесь https://docs.microsoft.com/en-us/ef/core/modeling/relationships?tabs=fluent-api%2Cfluent-api-simple-key%2Csimple-key

Это будет пример для вашего случая

User {

public int Id {Get; Set;}
public string Name{Get; Set;}

public ICollection<EventMember> EventMembers {Get; Set;}

}

Event {

public int Id {Get; Set;}
public string Name{Get; Set;}

public ICollection<EventMember> EventMembers {Get; Set;}

}

EventMember {

public int UserId {Get; Set;}
//optional
public User User{Get; Set;}

public int EventId {Get; Set;}
//optional
public Event Event{Get; Set;}

}

вам также нужно предоставить отображение в вашем классе dbcontext для этого отношения

modelBuilder.Entity<EventMember>()
            .HasKey(t => new { t.UserId, t.EventId });

        modelBuilder.Entity<EventMember>()
            .HasOne(pt => pt.Event)
            .WithMany(p => p.EventMember)
            .HasForeignKey(pt => pt.UserId);

        modelBuilder.Entity<EventMember>()
            .HasOne(pt => pt.User)
            .WithMany(t => t.EventMember)
            .HasForeignKey(pt => pt.EventId);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...