我有三个类: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
对象。
此问题中的代码与建立关系有关。此问题中报告的问题涉及未自动加载的相关数据。这是两个彼此没什么关系的不同事物。 你错过了某个地方吗?您是否已访问(并因此延迟加载)角色导航道具,但未访问权限导航道具?我希望看到代码从您启动查询的位置开始,直到您检查此对象的位置(根据您的屏幕截图)
您使用所请求的代码回复:
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,问题解决了。这是解决方案,所以请将其作为答案发布,以便接受它。
Id
财产缺少Role
和Permission
表。当你在RoleId
表中说RolePermission
属性时,EF在Role
表中寻找Id Property。
像这样更新您的角色和权限表并尝试:
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; }
}