我尝试使用代码优先迁移来映射C#EF中的太多关系。
我遇到的问题是没有从相关表中填充任何结果。以这段代码为例,_role
不包含任何权限,而它应包含4个结果:
foreach (Role _role in _dbContext.Roles) //_dbContext.Roles.Count = 2
{
foreach(Permission _permission in _role.Permissions) //_role.Permissions.Count = 0
{
//Do something with each _permission
}
}
这些课程如下:
[Table("Roles")]
public partial class Role
{
public Role()
{
Permissions = new HashSet<Permission>();
}
[Key]
public int RoleId { get; set; }
public string RoleName { get; set; }
public ICollection<Permission> Permissions { get; set; }
}
[Table("Permissions")]
public partial class Permission
{
public Permission()
{
Roles = new HashSet<Role>();
}
[Key]
public int PermissionId { get; set; }
public string PermissionName { get; set; }
public virtual ICollection<Role> Roles { get; set; }
}
最后是Fluent API:
modelBuilder.Entity<Permission>()
.HasMany(e => e.Roles)
.WithMany(e => e.Permissions)
.Map(m => m
.ToTable("_Lnk_Role_Permission")
.MapLeftKey("PermissionId")
.MapRightKey("RoleId"));
检查数据库后,表,密钥和数据都是有序的,手动添加和查询数据会产生正确的结果。尝试访问数据时,存在角色但没有权限。
任何人都可以看到它可能出错的地方吗?
答案 0 :(得分:1)
我认为您正在寻找Include声明。
foreach (var role in _dbContext.Roles.Include(x => x.Permissions))
{
...
}
虚拟关键字是一种很好的做法,在数据加载方式中起着重要作用。如果您不小心,最终可以进行1 + N次查询(对于Role对象为1,对于每个Permission为N更多)。 Include语句告诉EF有效地连接数据库查询中的表,以便数据在内存中可用于处理嵌套的for循环。
在其他地方链接的道歉,但MSDN链接应该在这里停留一段时间。这是一个很好的阅读,以了解虚拟/非虚拟和有/没有Include语句的含义: https://msdn.microsoft.com/en-us/data/jj574232.aspx
答案 1 :(得分:0)
经过几个小时的头部刮擦,我错过了Virtual
的{{1}}。修改后的类看起来像这样:
ICollection