2

EF 코드 우선으로 개체를 데이터베이스에서 가져 오려고 할 때 몇 가지 문제가 있습니다. 내가 사용하고있는 프로그램은 Visual Studio 2010이고 프로젝트 유형은 ASP.NET MVC3 프로젝트입니다.EF 코드 첫 번째 - 데이터베이스에서 오는 개체가 null입니다.

이제 데이터베이스에서 FK가 제대로 구성되었지만 연결된 개체가 항상 null이라는 문제가 있습니다.

구체적인 시나리오 : 사용자에게는 팀 (선택 사항)이 있고 팀에는 사용자 (사용자 수는 0 일 수 있음)가 있습니다. 이제 특정 사용자와 함께 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(); 
    } 
} 

: 나는 모든 적절한 속성이 DB에서 오는 사용자 개체가에 user.Team가 null을 제외하고

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가 있어야하며 사용자에게는 해당 팀 ID가 있지만 팀은 항상 null입니다.

나는이 문제로 인해 상당히 좌절하고 있기 때문에 누군가가 살펴볼 수 있다면 정말 고맙겠습니다.

인사말 쿼리에서

+0

로그인 한 사용자 – keshav

+0

예와 동일한 teanId를 가진 모든 항목에 대해 사용자 테이블을 쿼리하여 언제든지 검색 할 수 있습니다. 그 팀의 사용자 만 필요하면 그럴 것입니다. 제 경우에는 Team 객체가 필요합니다.이 객체는 응용 프로그램에서 계속 사용될 다른 객체와도 연관되어 있기 때문입니다. – SimranS

+0

User 클래스에 TeamId 속성을 추가 해보십시오. 나는 항상 그렇게하며, 그런 일이 일어나는 것을 보지 못했다. – deerchao

답변

1

.Include 당신이하고있는 열망로드를 사용

Users.Include(e => e.Team) 
1

로 팀을 포함한다.

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

관련 항목로드! :)