I have the following Entity Framework POCO classes:
public class Customer
{
public int Id {get;set;}
public string Name {get;set;}
public virtual ICollection<Order> Orders {get;set;}
}
public class Order
{
public int Id {get;set;}
public int CustomerId {get;set;}
public int OrderTypeId {get;set;}
public virtual OrderType Type {get;set;}
public virtual Customer Customer {get;set;}
}
public class OrderType
{
public int Id {get;set;}
public virtual ICollection<Order> Orders {get;set;}
}
The problem is that when I return my ICollection<Order>
I'm getting the Order
s alright, but the OrderType
property of the Order
is not being populated. My Order will contain the following detail:
Id: 1
CustomerId: 1
Customer: Populated
OrderTypeId: 3
Type: null // Never returned
My mapping code looks like the following:
public void ConfigureOrder(ModelBuilder builder)
{
// Mapping from Order -> Customer
builder.Entity<Order>()
.HasRequired(x => x.Customer)
.WithMany(x => x.Orders)
.HasConstraint((order, cust) => order.CustomerId == cust.Id);
// Mapping from Order -> OrderType
builder.Entity<Order>()
.HasRequired(x => x.OrderType)
.WithMany(x => x.Orders)
.HasConstraint((order, type) => order.OrderTypeId == type.Id);
}
I've then disabled Lazy loading in my context:
public Context(string connectionString)
: base(connectionString)
{
ObjectContext.ContextOptions.LazyLoadingEnabled = false;
}
So to return the data in my repository I use the Include
method of System.Data.Entity
:
var query = from item in context.Customers
.Include(x=> x.Orders)
where item.Id == customerId
select item;
I was assuming that because I couldn't specify Orders.OrderType
, that was the problem, so I tried some variations:
1 -> .Include(x=> x.Orders.FirstOrDefault().OrderType)
2 -> .Include("Orders")
3 -> .Include("Orders")
.Include("Orders.OrderType")
But I can never get the OrderType property to be returned, unless I just load the Order directly:
var query = from item in context.Orders
.Include(x=> x.OrderType)
select item;
This code will correctly return the OrderType within the order.
Oh dear. Looks like I was a total donkey. It's 17:45, I should of gone home by now anyway.
I had two Get methods:
Get(int customerId)
{
// This was the method I was testing within
var query = from item in context.Customers
.Include("Orders.OrderType")
select item;
}
Get(int customerId, int versionId)
{
// This was the method that was running
var query = from item in context.Customers
.Include(item.Orders)
select item;
}
So, "Orders.OrderType"
was the correct, albeit nasty looking solution. I need some caffeine.
EDIT:
Just coming back to this question, the best way for includes is to use System.Data.Entity
's Include method:
.Include(x=> x.Orders.Select(o=> o.OrderType));
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With