EF Code First : Probleme mit Laden von Collections
-
Thursday, January 06, 2011 1:19 PM
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
Problem : Sobald ich die Collection im RealmModel aufrufen will kriege ich folgenden Fehler :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"]; } } }
{"Diesem Command ist bereits ein geöffneter DataReader zugeordnet, der zuerst geschlossen werden muss."}
Ich frage mich nun ernsthaft warum ?
Grüße
All Replies
-
Thursday, January 06, 2011 6:38 PMAnswerer
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
- Marked As Answer by Pawel Warmuth Friday, January 07, 2011 7:28 AM
-
Thursday, January 06, 2011 10:13 PM
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- Marked As Answer by Pawel Warmuth Friday, January 07, 2011 7:28 AM
-
Friday, January 07, 2011 7:28 AM
MARS und es geht weiter ;-)
Danke euch beiden !
Grüße
-
Thursday, December 13, 2012 11:48 PM
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 :)
- Edited by LukeSolar Thursday, December 13, 2012 11:49 PM

