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(); 

相關的條目! :)