使用 fluent 配置一对一关系时对象为 null api

Object is null when configuring one to one relationship with fluent api

我有三个类:RolePermissionRolePermission(角色权限是多对多[=38中的第三个table =]关系)

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 个对象。

Id 属性 RolePermission table 均缺失。当您在 RolePermission table 中说 RoleId 属性 时,EF 在 Role table.[=17= 中查找 Id 属性 ]

像这样更新您的角色和权限 table 并试一试:

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

这个问题中的代码与建立关系有关。此问题中报告的问题与未自动加载相关数据有关。这是两件完全没有关系的事情。
你错过了某个地方的包含吗?您是否访问过(并因此延迟加载)Role nav 道具,但没有访问 Permission nav 道具?我希望看到代码从您启动查询的位置开始到您检查此对象的位置(根据您的屏幕截图)

您回复了请求的代码:

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, yes, I have to use include and the problem is solved. This is the solution, so please post it as an answer in order to accept it.