2015-03-18 3 views
0

Почему LINQ без Inlcude возвращает null для ссылки на другую модель?LINQ without Include возвращает null

Модели

public class ApplicationUser : IdentityUser 
{ 
    public FilePath FilePath { get; set; } 
    public async Task<ClaimsIdentity> GenerateUserIdentityAsync(UserManager<ApplicationUser> manager) 
    { 
     var userIdentity = await manager.CreateIdentityAsync(this, DefaultAuthenticationTypes.ApplicationCookie); 
     return userIdentity; 
    } 

} 

public class FilePath 
{ 
    public int FilePathId { get; set; } 
    [StringLength(255)] 
    public string FileName { get; set; } 
    public FileType FileType { get; set; } 
} 

public enum FileType 
{ 
    Avatar = 1, 
    Photo = 2, 
    Study = 3 
} 

Контроллер

private ApplicationDbContext db = new ApplicationDbContext(); 

public ActionResult Details(string id) 
{ 
    //... 

    ApplicationUser appUser1 = db.Users.Find(id); 
    ApplicationUser appUser2 = db.Users.Include(i => i.FilePath).SingleOrDefault(i => i.Id == id); 
    if(appUser1.FilePath == null); //null 
    if(appUser2.FilePath == null); //not null, has all data 
    return View(appUser2); 
} 
+1

Что вы ожидаете от него, если вы не используете * .Include'? Почему это не должно быть нулевым? –

+0

@KirkWoll Итак, мне нужно использовать Include для * каждой * ссылки, которую я добавляю в своей модели? – SMUsamaShah

+1

Или используйте проекцию '.Select'. Или включите [ленивую загрузку] (https://msdn.microsoft.com/en-us/data/jj574232.aspx?f=255&MSPPError=-2147217396#lazy). (Я настоятельно рекомендую вам не использовать ленивую загрузку в сценарии производства, так как это может привести к неэффективной работе базы данных при использовании в цикле.) –

ответ

2

Вы должны отметить свой FilePath свойство как virtual сделать ленивую нагрузку на работу:

public virtual FilePath FilePath { get; set; } 

BTW: Вопрос должен быть изменен на «Entity Framework без Include возвращает null».

Entity Framework! = LINQ. LINQ - это концепция более высокого уровня, в то время как Entity Framework просто реализует поставщик LINQ, поэтому вы можете запрашивать базу данных с использованием синтаксиса linq.