EF 代码优先 - 来自数据库的对象为空

本文关键字:数据库 对象 代码 EF | 更新日期: 2023-09-27 18:34:35

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

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

具体方案:用户有一个团队(可选(,一个团队有其用户(Users.Count 可以为零(。现在,当与某个用户一起登录到 Web 应用程序时,应该可以显示该团队中的其他用户。问题是登录用户的 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 对象,其中包含来自数据库的所有正确属性,除了用户。团队为空。在数据库中,用户表具有外键列 TeamId,用户具有相应的 teamId,但 Team 始终为空。

如果有人能看一看,我将不胜感激,因为这个问题让我感到非常沮丧。

问候

EF 代码优先 - 来自数据库的对象为空

在查询中包括团队

Users.Include(e => e.Team)

使用.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();

相关条目已加载! :)