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.
+1 cho stringless bao gồm! – ProfK