实体不会在多对多关系中传递
Entities aren't passed in many-to-many relationship
我创建了一个多对多关系 EventUser
,其中包含 userId
、EventId
以及 User
和 Event
对象,以及作为一个 isPresent
布尔值,我用它来管理该事件的用户状态。
我通过设置 ID 和对象创建 EventUser
,然后将其添加到 Event's
EventUser
列表。但是,当我从数据库中获取 Events
时,EventUsers
的列表只有 returns 数据 UserId
、EventId
和 IsPresent
字段, User
和 Event
字段 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。
我创建了一个多对多关系 EventUser
,其中包含 userId
、EventId
以及 User
和 Event
对象,以及作为一个 isPresent
布尔值,我用它来管理该事件的用户状态。
我通过设置 ID 和对象创建 EventUser
,然后将其添加到 Event's
EventUser
列表。但是,当我从数据库中获取 Events
时,EventUsers
的列表只有 returns 数据 UserId
、EventId
和 IsPresent
字段, User
和 Event
字段 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。