使用 fluent 配置一对一关系时对象为 null api
Object is null when configuring one to one relationship with fluent api
我有三个类:Role
、Permission
和RolePermission
(角色权限是多对多[=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
属性 Role
和 Permission
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.
我有三个类:Role
、Permission
和RolePermission
(角色权限是多对多[=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
属性 Role
和 Permission
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.