使用流畅的api配置一对一关系时,Object为null

问题描述 投票:1回答:2

我有三个类: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

c# entity-framework ef-fluent-api
2个回答
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,问题解决了。这是解决方案,所以请将其作为答案发布,以便接受它。


0
投票

Id财产缺少RolePermission表。当你在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; }
}
© www.soinside.com 2019 - 2024. All rights reserved.