2

我在尝试使用EF Code First从数据库中获取对象时遇到了一些问题。我使用的程序是Visual Studio 2010,项目类型是ASP.NET MVC3项目。EF代码优先 - 来自数据库的对象为空

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

具体场景:用户有团队(可选),团队有其用户(Users.Count可以为零)。 现在,当某个用户登录到webapp时,应该可以显示该团队中的其他用户。问题是登录用户的Team对象为空。我找到了一个在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); 

所以后登录我与所有适当的属性从DB未来用户对象,除了user.Team为空。在数据库中,用户表具有外键列表TeamId,因为它应该和用户具有相应的teamId,仍然Team总是空。

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

问候

+0

您可以随时通过查询用户表来检索与登录用户具有相同teanId的所有条目。 – keshav

+0

是的,那是真的。如果我只需要该团队的用户,情况就会如此。在我的情况下,我需要Team对象,因为它还与将在应用中进一步使用的其他对象有关联。 – SimranS

+0

尝试在类User上添加一个TeamId属性。我总是那样做,而我却没有看到这样的事情发生。 – deerchao

回答

1

在查询中包括团队

Users.Include(e => e.Team) 
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(); 

相关的条目! :)