EF Code First - 来自数据库的对象为空

时间:2012-05-18 21:32:50

标签: c# asp.net-mvc-3 entity-framework ef-code-first fluent-interface

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

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

具体方案:用户拥有一个团队(可选),团队拥有其用户(Users.Count可以为零)。 现在,当使用某个用户登录到webapp时,应该可以显示该团队中的其他用户。问题是登录用户的Team对象为null。我在User(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对象,其中包含来自数据库的所有正确属性,但user.Team为null。在数据库中,User表有一个外键colum TeamId,并且用户拥有相应的teamId,但Team仍然是null。

如果有人可以看一下,我真的很感激,因为这个问题让我非常沮丧。

问候

2 个答案:

答案 0 :(得分:1)

在您的查询中包括

的团队
Users.Include(e => e.Team)

答案 1 :(得分: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();

已加载相关条目! :)