11

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 Orders 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.

1 Answer 1

22

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));
Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.