实体不会在多对多关系中传递

Entities aren't passed in many-to-many relationship

我创建了一个多对多关系 EventUser,其中包含 userIdEventId 以及 UserEvent 对象,以及作为一个 isPresent 布尔值,我用它来管理该事件的用户状态。

我通过设置 ID 和对象创建 EventUser,然后将其添加到 Event's EventUser 列表。但是,当我从数据库中获取 Events 时,EventUsers 的列表只有 returns 数据 UserIdEventIdIsPresent 字段, UserEvent 字段 return null.

这些是我的 classes:

用户实体

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>();
        }
    }

事件用户class

    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; }
    }

我的 DbContext 中的 OnModelCreating 方法,我在其中创建多对多关系

        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);
        }

EventAppService 中的 AddGroupUsersToEvent 方法,我在其中创建一个组的所有用户并将其作为 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);
        }

我在其中列出所有事件的 EventAppService 中的 ListAll 方法

        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;
        }

如果我 运行 Swagger 中的 ListAll 方法,它 return 是来自这样一个事件的 EventUsers 列表:

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

获取事件时是否必须在某处包含事件和用户对象?在调试时,我发现当我使用 Event 和 User 对象创建 EventUser 时,它们没有问题,但是一旦我得到事件,它们就会被 returned 为 null

您需要在从存储库获取相关数据时显式加载它们,

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

亚伦的回答对我有用!我唯一要做的就是在语句之​​后调用 ToList() 方法,因为它需要一个 ICollection 而不是 IEnumerable。