Io uso entity framework core 1.1.
Ho una query come sotto, e mi aspetto che gli utenti che hanno UserProfile utilizzando Includi, carichi UserProfile. Ma questa query restituisce sempre UserProfile null.
Query:
var user = dbContext.UserMappers
.Where(e => e.OldUserId == id)
.Select(e => e.User)
.Include(e=>e.UserProfile)
.FirstOrDefault();
Modelli:
public class UserMapper
{
[Key, ForeignKey(nameof(User))]
public string UserId { get; set; }
public User User { get; set; }
public int OldUserId { get; set; }
}
public class User : IdentityUser
{
public bool Suspended { get; set; }
public string Nickname { get; set; }
public virtual UserProfile UserProfile { get; set; }
}
public class UserProfile
{
[Key, ForeignKey(nameof(User))]
public string UserId { get; set; }
public string Name { get; set; }
public string Family { get; set; }
public string Telephone { get; set; }
}
Dalla documentazione di EF Core - Caricamento dei dati correlati - La sezione include ignorati (l'evidenziazione è mia):
Se si modifica la query in modo che non restituisca più istanze del tipo di entità con cui è iniziata la query , gli operatori di inclusione vengono ignorati.
Questo è diverso da EF6 dove Include
funziona sul tipo di entità di query finale. Non so se si tratta di una limitazione attuale o "di progettazione", ma per ora è necessario avviare le query con l'entità che richiede include.
Nel tuo caso, dovrebbe essere qualcosa del genere:
var user = dbContext.Users
// if you don't have inverse navigation property
.Where(e => dbContext.UserMappers.Any(um => um.UserId == e.Id && um.OldUserId == id))
// if you have inverse collection navigation property
//.Where(e => e.UserMappers.Any(um.OldUserId == id))
// if you have inverse reference navigation property
//.Where(e => e.UserMapper.OldUserId == id)
.Include(e => e.UserProfile)
.FirstOrDefault();