2010-09-23 25 views
11

Tôi có các lớp Entity Framework POCO sau:Mã khuôn khổ thực thể Đầu tiên - Eager Đang tải không hoạt động như mong đợi?

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

Vấn đề là khi tôi trở ICollection<Order> của tôi tôi nhận được Order s alright, nhưng OrderType tài sản của Order là không được phổ biến. Đặt hàng của tôi sẽ bao gồm các chi tiết sau đây:

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

đang lập bản đồ của tôi trông giống như sau:

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

Tôi đã sau đó tàn tật Lazy tải trong bối cảnh của tôi:

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

Vì vậy, để trả lại dữ liệu trong kho lưu trữ của tôi, tôi sử dụng phương thức Include của System.Data.Entity:

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

tôi đã giả định rằng bởi vì tôi không thể xác định Orders.OrderType, đó là vấn đề, vì vậy tôi đã thử một số biến thể:

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

Nhưng tôi có thể không bao giờ được sở hữu OrderType để được trả lại, trừ khi tôi chỉ tải Đơn đặt hàng trực tiếp:

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

Mã này sẽ trả lại đúng thứ tự OrderType trong đơn đặt hàng.

Trả lời

22

Oh dear. Có vẻ như tôi là một con lừa. Đó là 17:45, tôi nên đi về nhà ngay bây giờ.

tôi có hai phương pháp Nhận:

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

Vì vậy, "Orders.OrderType" là đúng, mặc dù giải pháp rất khó chịu. Tôi cần một ít cafein.

EDIT:

Chỉ cần trở lại với câu hỏi này, cách tốt nhất để bao gồm là sử dụng System.Data.Entity 's Bao gồm phương pháp:

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

+1 cho stringless bao gồm! – ProfK

Các vấn đề liên quan