2016-08-27 3 views
1

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; } 
} 
+0

Könnten Sie bitte einige Beispielszenarien hinzufügen und ausgeben? – Developer

+0

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). –

+0

Beachten Sie, dass Sie im Konstruktor 'DbContext' den Wert false festlegen können, wenn Sie nie ein Lazy-Laden wünschen. –

Antwort

1

Lazy Loading für alle Unternehmen im Rahmen auf der Configuration property durch Setzen eines Flag ausgeschaltet werden, wie gezeigt below.Please überprüfen, ob Sie das, oder nicht getan haben.

Beispiel:

public class MyContext : DbContext 
    { 
     public MyContext() //constructor 
     { 
      this.Configuration.LazyLoadingEnabled = false; 
     } 
    } 

Hinweis: Sie können immer noch verbundenen Unternehmen laden, indem Sie Eager Loading

Update:

können Sie verwenden diese:

Database.SetInitializer<ProgramContext>(new CreateDatabaseIfNotExists<ProgramContext>()); 

Statt Code:

if (!Database.Exists()) 
    { 
     Task.Run(InitializeDatabase).Wait(); 
    } 

Update 2:

Ihr Problem hier ist, haben Sie nicht this Keyword mit dem Configuration property.You verwendet haben es wie unten gezeigt .

this.Configuration.LazyLoadingEnabled = false; 
+0

Danke für die Antwort. Wahr. Ich habe es getan und funktioniert perfekt. Das Problem tritt auf, wenn die Datenbankinitiierung stattfindet. Das ist der Fall, wenn das Laden von Lazy fehlschlägt Wenn die InitializeDatabase ausgeführt wird, funktioniert das verzögerte Laden nicht. Wenn nicht, funktioniert es perfekt. Hast du eine Ahnung warum? – Thilo

+0

können Sie Ihren db-Initialisierungscode auch teilen? – Sampath

+0

Ich habe meinen Konstruktor und ein bisschen mehr eine Beschreibung in den ursprünglichen Beitrag oben hinzugefügt. Bitte sehen Sie sich das an. – Thilo

0

In diesem Fall suche ich nach dem SecondProgram im selben Kontext, den ich verwendet habe, um es zu erstellen. Es ist bereits mit SecondProgram geladen. Daher ist es nicht null.

ProgramContext _dbContext = new ProgramContext(); 

    _dbContext.Programs.Add(new Program 
    { 
     SecondProgram = new SecondProgram 
     { 
      Title = "Demo" 
     } 
    }); 
    _dbContext.SaveChanges(); 
    var item = _dbContext.Programs.Find(1); 

Wenn ich ein neues Kontextobjekt und Zugriffsprogramm wie

ProgramContext _newContext = new ProgramContext(); 
var item = _newContext.Programs.Find(1); 

Dann reden wir faul Loding schaffen Coz es Sachen von db geladen hat. Jetzt funktioniert es. SecondProgram ist null. Kann das jemand bestätigen?

Dies ist nicht Teil eines echten Programms. Ich hatte dieses Problem, wenn ich mit Testfällen mit NMemory and Effort arbeite.