Сущности не передаются в отношениях «многие ко многим» - PullRequest
0 голосов
/ 16 мая 2019

Я создал отношение «многие ко многим» EventUser, которое содержит объекты userId, EventId и User и Event, а также логическое значение isPresent, которое я использую для управленияПрисутствие пользователя для этого события.

Я создаю EventUser, устанавливая идентификаторы и объекты, а затем добавляя его в список Event's EventUser.Однако когда я получаю Events из базы данных, список EventUsers возвращает только данные, поля UserId, EventId и IsPresent, поля User и Event возвращают null.

Это мои классы:

Сущность пользователя

public class User : AbpUser<User>
    {
        public const string DefaultPassword = "123qwe";
        public string Instrument { get; set; }
        public virtual ICollection<EventUser> EventUsers { get; set; }

        public static string CreateRandomPassword()
        {
            return Guid.NewGuid().ToString("N").Truncate(16);
        }

        public static User CreateTenantAdminUser(int tenantId, string emailAddress)
        {
            var user = new User
            {
                TenantId = tenantId,
                UserName = AdminUserName,
                Name = AdminUserName,
                Surname = AdminUserName,
                EmailAddress = emailAddress,
                Roles = new List<UserRole>(),
            };

            user.SetNormalizedNames();

            return user;
        }
    }

Сущность события

    public class Event : Entity
    {
        [Required]
        public string Name { get; set; }

        [Required]
        public string Location { get; set; }
        public string Address { get; set; }

        public DateTime StartTime { get; set; }
        public DateTime EndTime { get; set; }

        public bool IsConfirmed { get; set; }

        public int GroupId { get; set; }

        public virtual ICollection<EventUser> EventUsers { get; set; }

        public Event()
        {
            EventUsers = new List<EventUser>();
        }
    }

Класс EventUser

    public class EventUser : Entity
    {
        public int EventId { get; set; }
        public Event Event { get; set; }
        public long UserId { get; set; }
        public User User { get; set; }

        public bool IsPresent { get; set; }
    }

Метод OnModelCreating в моем DbContext, в котором я создаю отношение «многие ко многим»

        protected override void OnModelCreating(ModelBuilder modelBuilder)
        {
            base.OnModelCreating(modelBuilder);
            modelBuilder.Entity<EventUser>().HasKey(eu => new { eu.EventId, eu.UserId }); //.isUnique()?
            modelBuilder.Entity<EventUser>().HasOne(eu => eu.Event)
                .WithMany(e => e.EventUsers)
                .HasForeignKey(eu => eu.EventId);
            modelBuilder.Entity<EventUser>().HasOne(eu => eu.User)
                .WithMany(u => u.EventUsers)
                .HasForeignKey(eu => eu.UserId);
        }

Метод AddGroupUsersToEvent в EventAppService, в котором я создаю и добавляю всех пользователей группы в событие как EventUsers.

        public void AddAllEventUsersFromGroup(AddAllEventUsersFromGroupDto dto)
        {
            var e = _eventManager.GetEventById(dto.EventId);
            var g = _groupManager.QueryGroups().FirstOrDefault(x => x.Id == dto.GroupId);

            foreach (var user in g.Users)
            {
                var eu = new EventUser
                {
                    EventId = e.Id,
                    Event = e,
                    UserId = user.Id,
                    User = user
                };
                e.EventUsers.Add(eu);
            }
            _eventManager.Update(e);
        }

Метод ListAll в EventAppService, в котором я перечисляю все события

        public IEnumerable<EventDto> ListAll()
        {
            var result = _eventManager.QueryEvents().Select(e => new EventDto
            {
                Id = e.Id,
                Name = e.Name,
                Location = e.Location,
                Address = e.Address,
                StartTime = e.StartTime,
                EndTime = e.EndTime,
                GroupId = e.GroupId,
                EventUsers = e.EventUsers
            }).OrderBy(e => e.StartTime).ToList();
            return result;
        }

Если я запускаю метод ListAll в Swagger, он возвращает список EventUsers из события, подобного этому:

      "eventUsers": [
        {
          "eventId": 3,
          "event": null,
          "userId": 4,
          "user": null,
          "isPresent": true,
          "id": 0
        }
    ]

Нужно ли где-нибудь включать событие и объект пользователя при получении событий?Во время отладки я обнаружил, что объекты Event и User хороши, когда я использую их для создания EventUser, но возвращаются как null, как только я получаю событие.

Ответы [ 2 ]

0 голосов
/ 19 мая 2019

Ответ Аарона сработал для меня! Единственное, что мне нужно было сделать, - это вызвать метод ToList() после оператора, потому что он ожидает ICollection, а не IEnumerable.

0 голосов
/ 19 мая 2019

Вам нужно явно загружать связанные данные, пока вы получаете их из репозитория,

Repository.GetAll()
                .Include(x => x.Event)
                .Include(x => x.User)
...