Ich arbeite mit EF 6 und Lazy loading.Entity Framework 6 Lazy Laden mit Db-Initiierung
class MainPrograme
{
static void Main(string[] args)
{
ProgramContext _dbContext = new ProgramContext();
_dbContext.Programs.Add(new Program
{
SecondProgram = new SecondProgram
{
Title = "Demo"
}
});
_dbContext.SaveChanges();
var item = _dbContext.Programs.Find(1);
}
}
Sobald ich ein träges Laden deaktivieren mit
Configuration.LazyLoadingEnabled = false;
Es funktioniert gut. Es sind keine relationalen Objekte geladen. item.SecondProgram
ist null
. Perfekt. Wenn ich jedoch die Datenbank lösche, richtet meine db-Initiierung eine neue db ein, und dann funktioniert das verzögerte Laden nicht. Wenn ich das obige Programm erneut ausführe, funktioniert das Lazy Loading wieder einwandfrei. Habt ihr eine Ahnung warum? Vielen Dank.
Hier mein Konstruktor ist
public ProgramContext()
: base("Data Source=xxx;")
{
Configuration.LazyLoadingEnabled = false;
if (!Database.Exists())
{
Task.Run(InitializeDatabase).Wait();
}
}
Wenn Datenbank nicht existiert, InitializeDatabase wird die DB-Setup und wenn ich eine DB-Abfrage im gleichen Kontext Beispiel tun, nicht verzögertes Laden. Wenn ich ein neues Kontextobjekt erzeuge und db über dieses abfrage, funktioniert Lazy Loading.
Update -
Im Folgenden finden Sie mein volles Konsolenprogramm. Führen Sie es aus und überprüfen Sie die Eigenschaft SecondProgram, wenn das Element vorhanden ist. Es ist nicht null. Lazy Loading funktioniert nicht dort. Führen Sie das Programm erneut aus, ohne die Datenbank zu löschen, und überprüfen Sie die Eigenschaft SecondProgram erneut. Is ist wie erwartet null. Warum war im ersten Lauf nicht null?
class MainPrograme
{
static void Main(string[] args)
{
ProgramContext _dbContext = new ProgramContext();
_dbContext.Programs.Add(new Program
{
SecondProgram = new SecondProgram
{
Title = "Demo"
}
});
_dbContext.SaveChanges();
var item = _dbContext.Programs.Find(1);
}
}
public class Program
{
public int Id { get; set; }
public string Title { get; set; }
public virtual ICollection<SecondProgram> SecondPrograms { get; set; }
public virtual SecondProgram SecondProgram { get; set; }
}
public class SecondProgram
{
public int Id { get; set; }
public string Title { get; set; }
}
public class ProgramContext : DbContext
{
public ProgramContext()
: base("Data Source=XXX;Initial Catalog=MyContainer;Integrated Security=True;")
{
Configuration.LazyLoadingEnabled = false;
}
public DbSet<Program> Programs { get; set; }
}
Könnten Sie bitte einige Beispielszenarien hinzufügen und ausgeben? – Developer
Nicht ganz sicher, ich verstehe die Frage, aber die 'Configuration.LazyLoadingEnabled' ist kontextbasiert. Du musst es also für jeden 'DbContext' aufrufen, den du nicht laden willst (jedes Mal, wenn du einen DbContext erstellst). –
Beachten Sie, dass Sie im Konstruktor 'DbContext' den Wert false festlegen können, wenn Sie nie ein Lazy-Laden wünschen. –