2

尝试使用 EF Code First 将对象从数据库中取出时遇到一些问题。我使用的程序是 Visual Studio 2010,项目类型是 ASP.NET MVC3 项目。

现在,问题是关联对象始终为空,尽管 FK 在数据库中已正确配置。

具体场景:一个用户有一个团队(可选),一个团队有它的用户(Users.Count 可以为零)。现在,当使用某个用户登录 webapp 时,应该可以显示该团队中的其他用户。问题是登录用户的 Team 对象为空。我找到了在用户中使用外键(int?teamId)并使用此外键分配适当团队的解决方法。但是,我的问题应该在不使用这种方法的情况下得到解决。我的代码:

public class Team
    {
    [Key]
    public int Id { get; set; }
    [MaxLength(100)]
    public string Name { get; set; }
    public virtual ICollection<User> UsersInTeam { get; set; }

    public Team()
    {
        UsersInTeam = new List<User>();
    }

    public void AddUser(User user)
    {
        if(UsersInTeam.Contains(user))
            throw new ArgumentException(String.Format("Cannot add {0} to {1} because the user is already assigned to that team", user.Name, Name));

        user.Team = this;
        UsersInTeam.Add(user);
    }

 public class User
 {
    public int Id { get; set; }
    [Required, MaxLength(100)]
    public string Email { get; set; }
    [Required, MaxLength(100)]
    public string Password { get; set; }
    [Required, MaxLength(100)]
    public string Name { get; set; }
    [Required, MaxLength(100)]
    public string FirstName { get; set; }
    public string Mobile { get; set; }
    public bool IsAdminstrator { get; set; }
    public virtual Team Team { get; set; }

    public User()
    {
        Team = new Team();
    }
}

现在进行映射:

modelBuilder.Entity<Team>().HasMany(t => t.UsersInTeam).WithOptional(u => u.Team).Map(m => m.MapKey("TeamId")).WillCascadeOnDelete(false);
modelBuilder.Entity<User>().HasOptional(u => u.Team).WithMany(u => u.UsersInTeam).Map(m => m.MapKey("TeamId")).WillCascadeOnDelete(false);

所以登录后,我有一个用户对象,其中包含来自数据库的所有正确属性,除了 user.Team 为空。在数据库中,用户表应该有一个外键列 TeamId,并且用户有相应的 teamId,但 Team 始终为空。

如果有人可以看一下,我将不胜感激,因为由于这个问题,我感到非常沮丧。

问候

4

2 回答 2

1

使用.Include你正在做急切的加载。您还可以在查询后执行此操作来进行显式加载

var User = context.Users.Find(id); // Load the User.
context.Entry(User)
    .Reference(u => u.Team)
    .Load();

您还可以:

var Team = context.Teams.Find(id);
context.Entry(Team)
    .Collection(t => t.Users)
    .Load();

相关条目已加载!:)

于 2012-05-18T22:25:52.990 回答
1

在您的查询中包括团队

Users.Include(e => e.Team)
于 2012-05-18T22:08:31.890 回答