2009-09-26 34 views
6

Tôi đang sử dụng mô hình kho chung với các phương pháp:Entity Framework và mô hình kho vấn đề

private ObjectQuery<T> ObjectQueryList() 
    { 
     var list = CamelTrapEntities.CreateQuery<T>(EntitySetName); 
     return list; 
    } 

public IQueryable<T> List() 
    { 
     return ObjectQueryList(); 
    } 

Metod Danh sách() trả về IQueryable < T >, becase IQueryable < T > rất dễ dàng để chế nhạo. Tôi cũng có phương pháp khuyến nông:

public static IQueryable<T> Include<T>(this IQueryable<T> obj, string path) 
    { 
     if (obj is ObjectQuery<T>) 
      (obj as ObjectQuery<T>).Include(path); 

     return obj; 
    } 

Phương pháp này được sử dụng bên ngoài kho để có được danh sách thực thể có tính chất định hướng đã được nạp, ví dụ: List.Include ("CreatedBy"). Vấn đề là nó không hoạt động. Tất cả bao gồm đều bị bỏ qua. khi tôi thay đổi phương thức List() thành

public ObjectQuery<T> List() 
    { 
     return ObjectQueryList(); 
    } 

mọi thứ hoạt động tốt.

Tôi nên triển khai mẫu kho lưu trữ để có thể thực thi các truy vấn phức tạp hơn như thế nào?

Trả lời

6

Reflector đã cho tôi một câu trả lời:

public ObjectQuery<T> Include(string path) 
{ 
    EntityUtil.CheckStringArgument(path, "path"); 
    return new ObjectQuery<T>(base.QueryState.Include<T>((ObjectQuery<T>) this, path)); 
} 

Bao gồm lợi nhuận đối tượng ObjectQuery mới và tôi bao gồm chức năng quay trở lại đối tượng cũ. Thay đổi thành

public static IQueryable<T> Include<T>(this IQueryable<T> obj, string path) 
{ 
    if (obj is ObjectQuery<T>) 
     return (obj as ObjectQuery<T>).Include(path); 

    return obj; 
} 

giải quyết được sự cố. Mất vài giờ và tôi ghét Khung thực thể nhiều hơn :)

Điều đó khiến tôi cũng nhận ra rằng tôi nên tạo một hàm Danh sách khác với tham số Bao gồm và không cho phép thực hiện bao gồm kho lưu trữ bên ngoài.

1

Here là triển khai mẫu Repository toàn diện nhất mà tôi từng thấy cho EF. Tôi không thể nói chắc chắn nếu nó sẽ cho phép bạn làm Bao gồm(), nhưng nếu tôi đọc quyền thực hiện nó nên.

1

Với EntityFramework 4.1, DbExtensions (System.Data.Entity.DbExtensions) giải quyết vấn đề này và tự thêm cả .Include([string path]).Include([property expression]) cho bất kỳ IQueryable<T>.

Chỉ cần chắc chắn rằng dự án sử dụng tham chiếu kho lưu trữ EntityFramework của bạn và, như với bất kỳ phương pháp mở rộng nào, chỉ định using System.Data.Entity; trong tệp lớp học của bạn để truy cập vào các tiện ích này.

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