尝试使用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。
如果有人可以看一下,我真的很感激,因为这个问题让我非常沮丧。
问候
答案 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();
已加载相关条目! :)