实体框架很多太多没有填充结果

时间:2015-10-28 00:00:35

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

我尝试使用代码优先迁移来映射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"));

检查数据库后,表,密钥和数据都是有序的,手动添加和查询数据会产生正确的结果。尝试访问数据时,存在角色但没有权限。

任何人都可以看到它可能出错的地方吗?

2 个答案:

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