November 27th, 2011Using The DataContext In EntityFramework To Retrieve Nested Objects
I’m always somewhat amazed when I read something from documentation that is not straight forward and it actually works. So amazed and excited that I often feel the need to blog about it.
So, here is the problem. I created a CodeFirst implementation of EntityFramework in Visual Studio and created a simple hierarchy in my data model. That is, without showing all the code, here is what I have:
public class Person{ [Key] [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)] public int Id { get; set; } public virtual List<EmailAddressInfo> EmailAddressInfoList { get; set; } ..} public class EmailAddressInfo{ [Key] [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)] public int Id { get; set; } public string EmailAddress { get; set; } }
public class EmailAccount{ [Key] [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)] public int Id { get; set; } ...}
Now, if you execute a LINQ command like the following:
var recs = (from data in db.Persons select data); foreach (var rec in recs) { foreach (var email in rec.EmailAddressInfoList) { Console.WriteLine(email); } }
You get the error:
Exception Details: System.InvalidOperationException: There is already an open DataReader associated with this Command which must be closed first.
To solve this, you need to tell EntityFramework/CodeFirst to include the EmailAddressInfoList in the query. All you need to do is change the db.Persons to db.Persons.Include("EmailAddressInfoList") as follows:
var recs = (from data in db.Persons.Include("EmailAddressInfoList") select data);
Then, it all works!
Hope this helps.








