In my webapi2 application I used db first generation and I created a partial class of context to set both ProxyCreationEnabledand LazyLoadingEnabled to false.
But when I use db.ExameViaAereaOssea.Where(e => e.ConsultaId == model.ConsultaId).ToList() the relation property Consulta is loaded too.
That not happing when I use db.ExameViaAereaOssea.AsNoTracking().Where(e => e.ConsultaId == consultaId).ToList()
I don't want use AsNoTracking for every query
Here are my two classes
public partial class ExameViaAereaOssea { [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2214:DoNotCallOverridableMethodsInConstructors")] public ExameViaAereaOssea() { } public int ExameViaAereaOsseaId { get; set; } public Nullable<int> ConsultaId { get; set; } public string VAOE125 { get; set; } public string VAOE250 { get; set; } public string VAOE500 { get; set; } public string VAOE750 { get; set; } public string VAOE1000 { get; set; } public string VAOE1500 { get; set; } public string VAOE2000 { get; set; } public string VAOE3000 { get; set; } public string VAOE4000 { get; set; } public string VAOE6000 { get; set; } public string VAOE8000 { get; set; } public string VOOE500 { get; set; } public string VOOE750 { get; set; } public string VOOE1000 { get; set; } public string VOOE2000 { get; set; } public string VOOE3000 { get; set; } public string VOOE4000 { get; set; } public string TipoAudiometria { get; set; } public virtual Consulta Consulta { get; set; } } public partial class Consulta { [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2214:DoNotCallOverridableMethodsInConstructors")] public Consulta() { this.ExameViaAereaOssea = new HashSet<ExameViaAereaOssea>(); } public int ConsultaId { get; set; } public DateTime? Data {get;set;} public Nullable<int> PacienteId { get; set; } public Nullable<int> TipoConsultaId { get; set; } public Nullable<int> PacienteDadosProfissionaisId { get; set; } public Nullable<int> ClienteId { get; set; } [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")] public virtual ICollection<ExameViaAereaOssea> ExameViaAereaOssea { get; set; } } And here is the usage.
public class RegraConsulta(){ public ExamesConsulta BuscaExamesConsulta(Consulta model) { using (var db = new winmedEntities(false)) { var retorno = new ExamesConsulta(); retorno.DataConsulta = RetornaDataConsulta(db, model.ConsultaId); retorno.exAereaOssea = db.ExameViaAereaOssea.Where(c => c.ConsultaId == model.ConsultaId).ToList(); return retorno; } } public DateTime RetornaDataConsulta(winmedEntities db, int consultaId) { var consulta = db.Consulta.Find(consultaId); if (consulta == null) throw new RegraNegocioException("Consulta não encontrada"); return consulta.Data.Value; } } The return is used in Web Api Controller and return method used like return Ok(new RegraConsulta().BuscaExamesConsulta(new Consulta { ConsultaId = 1 }));
db.Configuration.AutoDetectChangesEnabled = false;? If I used this configuration and I need manipulate in another moment the result of a.ToList()I still able ?context.ChangeTracker.QueryTrackingBehavior = QueryTrackingBehavior.NoTracking;as first line in theusingblock), and generalize this in some wrapper function. If you find that dirty, my own preference goes for the generic method (most upvoted answer)QueryTrackingBehaviorConsultais loaded too earlier in the code. Lazy loading absolutely doesn't happen here.