使用流利的api配置一对一关系时,对象为null

时间:2018-09-10 09:38:59

标签: c# entity-framework ef-fluent-api

我有三个类:RolePermissionRolePermission(角色许可是多对多关系中的第三个表

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

enter image description here

2 个答案:

答案 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)

IdRolePermission均缺少属性。当您说出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; }
}