我有三个类:Role
,Permission
和RolePermission
(角色许可是多对多关系中的第三个表
public class Role : Entity
{
public string Name { get; set; }
public string Description { get; set; }
public virtual ICollection<RolePermission> RolePermissions { get; set; }
}
public class Permission : Entity
{
public string Name { get; set; }
public virtual ICollection<RolePermission> RolePermissions { get; set; }
}
public class RolePermission : Entity
{
public int RoleId { get; set; }
public int PermissionId { get; set; }
public Permission Permission { get; set; }
public Role Role { get; set; }
}
然后我使用fluentAPI
来配置关系:
对于Role
:
HasMany(role => role.RolePermissions)
.WithRequired(rolePermission => rolePermission.Role)
.HasForeignKey(rolePermission => rolePermission.RoleId);
对于Permission
:
HasMany(permission => permission.RolePermissions)
.WithRequired(rolePermission => rolePermission.Permission)
.HasForeignKey(rolePermission => rolePermission.PermissionId);
对于RolePermission
:
HasRequired(rolePermission => rolePermission.Permission)
.WithMany(permission => permission.RolePermissions)
.HasForeignKey(rolePermission => rolePermission.PermissionId);
HasRequired(rolePermission => rolePermission.Role)
.WithMany(role => role.RolePermissions)
.HasForeignKey(rolePermission => rolePermission.RoleId);
问题在于仅填充了Role
个对象。
答案 0 :(得分:1)
此问题中的代码与建立关系有关。此问题中报告的问题与未自动加载的相关数据有关。这是两种彼此无关的东西。
您是否在某个地方错过了包含?您是否已访问(因此延迟加载)角色导航道具,但未访问权限导航道具?我想看到从启动查询到检查该对象的代码(根据屏幕截图)
您回复了要求的代码:
var user = _userRepository
.FirstOrDefaultAsync(us => us.Email == email);
var userPermissions =
user.UserRoles
.First()
.Role
.RolePermissions
.Select(rp => rp.Permission)
.ToList();
如果在查询中插入Include()
语句,您将看到Permission
实际上将被正确提取。
我不确定您要检查哪个对象。屏幕快照告诉我您正在查看RolePermission
,但是发布的代码建议您获取Permission
对象的列表。
无论如何,您似乎已经使用Include
对其进行了修复:
Mihai Alexandru-Ionut @Flater,是的,我必须使用include并解决了问题。这是解决方案,因此请接受它作为答案。
答案 1 :(得分:0)
Id
表Role
和Permission
均缺少属性。当您说出RoleId
表中的RolePermission
属性时,EF会在Role
表中查找Id属性。
像这样更新您的角色和权限表并尝试:
public class Role : Entity
{
public int Id { get; set; }
public string Name { get; set; }
public string Description { get; set; }
public virtual ICollection<RolePermission> RolePermissions { get; set; }
}
public class Permission : Entity
{
public int Id { get; set; }
public string Name { get; set; }
public virtual ICollection<RolePermission> RolePermissions { get; set; }
}