Ho riscontrato un problema con il caricamento lazy in combinazione con un ciclo foreach.
Sto lavorando su un codice prima del backend di asp.net per un sito web, ea volte voglio raccogliere informazioni su più tabelle / modelli.
Ad esempio, prendi questo:
public class Foo
{
[Key]
public Int32 Id { get; set; }
public virtual Bar Bar { get; set; }
public Int32 someInt { get; set; }
}
public class Bar
{
[Key]
public Int32 FooId { get; set; }
[ForeignKey("FooId")]
public virtual Foo Foo { get; set; }
public String someString { get; set; }
}
public async Task<IHttpActionResult> getSomeInformation
{
using(WhateverContext context = new WhateverContext())
{
var Foos = context.Foos;
List<FrontendFriendlyModel> ForTheFrontend = new List<FrontendFriendlyModel>();
foreach (var Foo in Foos)
{
var entry = new FrontendFriendlyModel();
entry.Id = Foo.Id; //Works fine
entry.someInt = Foo.someInt; //Works also fine
entry.someString = Foo.Bar.someString; //Crashes, "There is already an open DataReader associated with this Command"
ForTheFrontend.Add(entry);
}
return Ok(ForTheFrontend); //I convert it to a Json String with Json.net, but thats not relevant I guess
}
}
So che posso attivare MARS nella mia stringa String.
Potrei anche caricare la barra sul posto ed evitare il problema.
var Foos = context.Foos.Include(f => f.Bar);
Da tutto ciò che ho raccolto, l'uso di MARS non è generalmente considerato una buona pratica, e non mi piace il fatto che devo caricarmi di tutto all'inizio.
Cose che potrei trovare su google a proposito di questo, non mi aiutano davvero qui (forse mi limito a succhiarlo su google), e sento che mi manca qualcosa di veramente semplice.
Quindi mi chiedo, qual è il modo corretto qui. Attivando MARS? Vuoi caricare tutto ciò di cui ho bisogno? Trasmetti l'IQueryable a un elenco?
var Foos = context.Foos.ToList();
foreach (var Foo in Foos)
{
var entry = new FrontendFriendlyModel();
entry.Id = Foo.Id; //Works fine
entry.someInt = Foo.someInt; //Works also fine
entry.someString = Foo.Bar.someString; //Now that works, but I don't get why it doesnt work as IQueryable.
ForTheFrontend.Add(entry);
}
Non capisco perché non posso lavorare con un IQueryable qui, quindi forse qualcuno può illuminarmi.