none
EF Code First : Probleme mit Laden von Collections

    Frage

  • Hallo zusammen,

    kleines Problem mit Code First :

    Erstmal meine Models :

     

    public class RealmModel
     {
      [System.ComponentModel.DataAnnotations.Key]
      public int Id { get; private set; }
      public string Name { get; private set; }
      public int HeaderRow { get{ return _headerRow - 1;} set{ _headerRow = value;} }
      private int _headerRow;
      public int StartRow { get { return _startRow - 1; } set { _startRow = value; } }
      private int _startRow;
      public int EndRow { get { return _endRow - 1; } set { _endRow = value; } }
      private int _endRow;
      public virtual System.Collections.Generic.ICollection<RuleModel> Rules { get; set; }
     }
    
    public class RuleModel
     {
      [System.ComponentModel.DataAnnotations.Key]
      public int Id { get; private set; }
      public string ColumnText { get; set; }
      public string RuleValue { get; set; }
      public virtual RealmModel Model { get; set; }
     }
    

     

    Und hier die Initalisierung der Datenbank

     

     class DatabaseCatalog : DbContext
     {
      public DatabaseCatalog()
       : base(new ConnectionStringConfiguration().ConnectionString)
      {
       System.Data.Entity.Infrastructure.Database.SetInitializer<DatabaseCatalog>(null);
       this.Database.CreateIfNotExists();
       
      }
      public DbSet<RealmModel> Realms { get; set; }
      public DbSet<RuleModel> Rules { get; private set;}
     }
    
     public class ConnectionStringConfiguration : ConfigurationSection
     {
      [ConfigurationProperty("ConnectionString", IsRequired = false, DefaultValue = @"Data Source=172.27.0.35;Initial Catalog=eScanner;User Id=xx;Password=xxx;")]
      public string ConnectionString { get { return (string)this["ConnectionString"]; } }
     }
    
    Problem : Sobald ich die Collection im RealmModel aufrufen will kriege ich folgenden Fehler :

     

    {"Diesem Command ist bereits ein geöffneter DataReader zugeordnet, der zuerst geschlossen werden muss."}

    Ich frage mich nun ernsthaft warum ?

     

    Grüße

     

    Donnerstag, 6. Januar 2011 13:19

Antworten

  • Hallo Pawel,

    ich habe das jetzt nicht getestet, aber:

    Das Entity Framework erwartet an mehreren Stellen,
    dass für den SQL Server MARS (Multiple Active Result Sets) aktiviert ist.

    Füge der Verbindungszeichenfolge ein MultipleActiveResultSets=True; hinzu.

    Gruß Elmar

    • Als Antwort markiert Pawel Warmuth Freitag, 7. Januar 2011 07:28
    Donnerstag, 6. Januar 2011 18:38
  • Hallo Pawel,

    normal sieht der StoreConnection-String beim Entity Framework etwa so aus:

          string storeConnectionString =
            ((EntityConnection)new AdventureWorksEntities().Connection).
            StoreConnection.ConnectionString;
          // ist normal: Data Source=.;Initial Catalog=AdventureWorks;
          //   Integrated Security=True;MultipleActiveResultSets=True
    
    
    • Zitat: "Beim Aufruf der Load-Methode in einer foreach-Enumeration wird von Entity Framework ein neuer Datenleser geöffnet. Diese Operation schlägt fehl, es sei denn, es wurde "Multiple Active Result Sets" aktiviert, indem in der Verbindungszeichenfolge multipleactiveresultsets=true angegeben wurde. Weitere Informationen finden Sie unter Multiple Active Result Sets (MARS) auf MSDN. Das Ergebnis einer Abfrage kann auch in eine List-Auflistung geladen werden. Damit wird der Datenleser geschlossen und das Durchlaufen der Auflistung zum Laden von Objekten, auf die verwiesen wird, ermöglicht."

    [...already an open DataReader associated with this Command which must be closed first]
    http://social.msdn.microsoft.com/Forums/en/adonetefx/thread/8cbe2049-53c9-4c02-b040-18ee30fd7800

     


    ciao Frank
    • Als Antwort markiert Pawel Warmuth Freitag, 7. Januar 2011 07:28
    Donnerstag, 6. Januar 2011 22:13

Alle Antworten

  • Hallo Pawel,

    ich habe das jetzt nicht getestet, aber:

    Das Entity Framework erwartet an mehreren Stellen,
    dass für den SQL Server MARS (Multiple Active Result Sets) aktiviert ist.

    Füge der Verbindungszeichenfolge ein MultipleActiveResultSets=True; hinzu.

    Gruß Elmar

    • Als Antwort markiert Pawel Warmuth Freitag, 7. Januar 2011 07:28
    Donnerstag, 6. Januar 2011 18:38
  • Hallo Pawel,

    normal sieht der StoreConnection-String beim Entity Framework etwa so aus:

          string storeConnectionString =
            ((EntityConnection)new AdventureWorksEntities().Connection).
            StoreConnection.ConnectionString;
          // ist normal: Data Source=.;Initial Catalog=AdventureWorks;
          //   Integrated Security=True;MultipleActiveResultSets=True
    
    
    • Zitat: "Beim Aufruf der Load-Methode in einer foreach-Enumeration wird von Entity Framework ein neuer Datenleser geöffnet. Diese Operation schlägt fehl, es sei denn, es wurde "Multiple Active Result Sets" aktiviert, indem in der Verbindungszeichenfolge multipleactiveresultsets=true angegeben wurde. Weitere Informationen finden Sie unter Multiple Active Result Sets (MARS) auf MSDN. Das Ergebnis einer Abfrage kann auch in eine List-Auflistung geladen werden. Damit wird der Datenleser geschlossen und das Durchlaufen der Auflistung zum Laden von Objekten, auf die verwiesen wird, ermöglicht."

    [...already an open DataReader associated with this Command which must be closed first]
    http://social.msdn.microsoft.com/Forums/en/adonetefx/thread/8cbe2049-53c9-4c02-b040-18ee30fd7800

     


    ciao Frank
    • Als Antwort markiert Pawel Warmuth Freitag, 7. Januar 2011 07:28
    Donnerstag, 6. Januar 2011 22:13
  • MARS und es geht weiter ;-)

     

    Danke euch beiden !

    Grüße

    Freitag, 7. Januar 2011 07:28
  • Kleiner Nachtrag hier:

    Wenn die Entitäten immer mit den entsprechenden .Include Anweisungen geladen werden, umgeht man dieses Problem.

    Also in diesem Fall: 

    beim laden dbContext.RuleModel.Include(t=>t.RealModel)

    Beim Zugriff auf RuleModel.Model (bzw. RuleModel.RealModel würde ich es nennen) sind dann schon alle notwendigen Daten vorhanden.

    Ich würde mal annehmen, dass im anderen Falle in einer for Schleife jedes mal beim Zugriff auf RuleModel.Model eine Abfrage gesendet wird. Müsste man aber überprüfen, vielleicht ist ja EF doch schlauer und speichert zumindest die schon geladenen RealModels zwischen.

    Hoffe das nützt jemand :)


    • Bearbeitet LukeSolar Donnerstag, 13. Dezember 2012 23:49
    Donnerstag, 13. Dezember 2012 23:48