实体框架代码First Many-To-Many不使用GUID加载相关实体

时间:2011-07-07 20:06:56

标签: c# entity-framework entity-framework-4.1 ef-code-first

我有一个自我引用的用户和管理员之间的多对多关系,如下所示:

 public class User
    {
        public virtual Guid UserId { get; set; }
        public virtual string Username { get; set; }    
        public virtual ICollection<UsersManagers> Managers { get; set; }
    }

public class UsersManagers
{
    public int UsersManagersId { get; set; }
    public virtual Guid ManagerId { get; set; }
    public virtual Guid UserId { get; set; }
    public int ManagerRank { get; set; }

    [ForeignKey("ManagerId")]
    public virtual User Manager { get; set; }
}

因此,用户可以拥有一些可以按排名排序的经理。当我为我的数据库和具有一些管理员的用户播种时,如下所示:

        var user = u.All.Where(e => e.Username == "Neil").FirstOrDefault(); 

        UsersManagers c = new UsersManagers {ManagerRank = 1, ManagerId = manager1.UserId, UserId = user.UserId};
        UsersManagers c1 = new UsersManagers { ManagerRank = 2, ManagerId = manager2.UserId, UserId = user.UserId };

在数据库中正确创建了所有内容。 UsersManagers表中有3个条目,其中包含正确的UserId,ManagerId和ManagerRank。

当我从我的存储库加载用户并尝试访问 Managers 属性时,该集合为空。我该怎么做才能解决这个问题?

任何帮助将不胜感激。

更新:

我已按照以下建议在加载用户时添加了管理员。 EF现在为错误的用户返回错误的管理员。以下是UsersManagers表中的数据,它应该为1个用户返回4个管理器,但它为4个用户返回1个管理器。

UsersManagersId        ManagerId            UserId                       ManagerRank
1   2157B648-7FE3-4784-A742-687682672EE8    F603EB04-FF22-4E8E-8FB2-3AA12F3F6C8F    1
2   862C2E56-8DF2-4110-B6E4-534B8C0E8F75    F603EB04-FF22-4E8E-8FB2-3AA12F3F6C8F    2
3   A95AD9A2-6475-4B4C-925A-6C0522E9B004    F603EB04-FF22-4E8E-8FB2-3AA12F3F6C8F    3
4   A6D37381-2507-46E8-B84D-059A1B4F1020    F603EB04-FF22-4E8E-8FB2-3AA12F3F6C8F    4

解决方案

解决方法是在UsersManagers中更改Manager的ForeignKey注释以使用“UserID”。

1 个答案:

答案 0 :(得分:1)

以下是一个示例代码位,用于在我的存储库中加载程序的所有会话和相关跟踪。

public Program GetById(int id)
{
    var entity = _context.Programs
        .Include(p => p.Sessions.Select(s => s.Trackings))
        .Single(p => p.ID == id);

     return entity;
}
相关问题