【问题标题】:Object is null when configuring one to one relationship with fluent api使用fluent api配置一对一关系时对象为null
【发布时间】:2018-09-10 09:38:59
【问题描述】:

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

【问题讨论】:

  • 这个问题中的代码与建立关系有关。此问题中报告的问题与未自动加载的相关数据有关。这是两件不同的事情,彼此之间几乎没有关系。向我们展示您从何处启动查询的代码。您是否在某处错过了包含?您是否访问过(并因此延迟加载) Role nav 属性,但没有访问 Permission nav 属性?我想查看从您启动查询的位置到您检查此对象的位置的代码(根据您的屏幕截图)
  • @Flater,这是查询:var user = _userRepository.FirstOrDefaultAsync(us =&gt; us.Email == email); var userPermissions = user.UserRoles.First().Role.RolePermissions.Select(rp =&gt; rp.Permission).ToList();
  • @Flater,是的,我必须使用 include,问题就解决了。这是解决方案,因此请将其作为答案发布以接受它。

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


【解决方案1】:

此问题中的代码与建立关系有关。此问题中报告的问题与未自动加载的相关数据有关。这是两件不同的事情,彼此之间几乎没有关系。
您是否在某处错过了包含?您是否访问过(并因此延迟加载) 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,是的,我必须使用 include,问题就解决了。这是解决方案,因此请将其作为答案发布以接受它。

【讨论】:

    【解决方案2】:

    Id 缺少 RolePermission 表的属性。当你在RolePermission 表中说RoleId 属性时,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; }
    }
    

    【讨论】:

    • Role 继承 Entity 类,该类有一个名为 Id 的虚拟成员。我忘了提。
    猜你喜欢
    • 1970-01-01
    • 2019-01-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-08
    相关资源
    最近更新 更多