2010-09-23 2 views
11

У меня есть следующие классы Entity Framework POCO:Entity Framework Code First - Eager Loading не работает, как ожидалось?

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;} 
} 

Проблема заключается в том, что, когда я возвращаюсь мой ICollection<Order> Я получаю Order s хорошо, но OrderType свойство Order не заселяется. Мой заказ будет содержать следующую деталь:

Id:   1 
CustomerId: 1 
Customer: Populated 
OrderTypeId: 3 
Type:  null  // Never returned 

Мой картирование код выглядит следующим образом:

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); 
} 

Я тогда отключил отложенную загрузку в моем контексте:

public Context(string connectionString) 
    : base(connectionString) 
{ 
    ObjectContext.ContextOptions.LazyLoadingEnabled = false; 
} 

Так вернуть данные в моем хранилище Я использую метод Include от System.Data.Entity:

var query = from item in context.Customers 
       .Include(x=> x.Orders) 
      where item.Id == customerId 
      select item; 

Я предполагал, что, потому что я не мог указать Orders.OrderType, что была проблема, поэтому я попробовал некоторые варианты:

1 -> .Include(x=> x.Orders.FirstOrDefault().OrderType) 
2 -> .Include("Orders") 
3 -> .Include("Orders") 
    .Include("Orders.OrderType") 

Но я никогда не может получить свойство OrderType должны быть возвращены, если не я просто нагрузки заказ:

var query = from item in context.Orders 
       .Include(x=> x.OrderType) 
      select item; 

Этот код будет правильно возвращать OrderType в заказе.

ответ

22

О, дорогой. Похоже, я был полным ослом. Это 17:45, мне все равно пришлось уйти домой.

У меня было два метода: Get

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; 
} 

Итак, "Orders.OrderType" был правильным, хотя и неприятным ищут решение. Мне нужен кофеин.

EDIT:

Только возвращаясь к этому вопросу, то лучший способ включает в себя это использовать System.Data.Entity «s Включить метод:

.Include(x=> x.Orders.Select(o=> o.OrderType)); 
+4

+1 для волокнистых нитей включают в себя! – ProfK

Смежные вопросы