2012-12-22 8 views
5

Tôi sử dụng MVC4 và khung thực thể 5 trong dự án của tôi và tôi đã có rất nhiều bảng. Theo quy định của dự án của chúng tôi, chúng tôi không xóa bất kỳ bản ghi nào khỏi cơ sở dữ liệu, mỗi bản ghi có trường isActive và nếu trường đó là sai, thì chúng tôi xem xét nó đã bị xóa. Tôi muốn viết một phương pháp mở rộng để có được hồ sơ hoạt động và sau khi một số googling tôi đã viết này:Có quyền sử dụng các phương pháp mở rộng trong trường hợp của tôi không?

public static IQueryable<Company> GetAll(this IQueryable<Company> source) 
{ 
    return source.Where(p => p.isActive); 
} 

Bây giờ tôi có thể sử dụng phương pháp khuyến nông của tôi để có được hồ sơ chỉ hoạt động như

Context db = new Context(); 
db.Company.GetAll(); 

Nhưng giả sử tôi đã có hơn 50 bảng trong cơ sở dữ liệu của tôi, đó là một cách tiếp cận tốt để viết cùng một phương thức mở rộng cho mỗi bảng của tôi. Có cách nào tốt hơn để viết một phương thức mở rộng GetAll() duy nhất cho tất cả các bảng của chúng ta không? Trên thực tế tôi thậm chí không chắc chắn nếu nó là đúng cách để sử dụng các phương pháp mở rộng cho trường hợp này?

Ai đó có thể giúp tôi và chỉ cho tôi đúng cách không? Tôi đánh giá cao nếu bạn giúp đỡ với các ví dụ mã.

Trả lời

1

Tùy thuộc vào cách bạn đang sử dụng Khung thực thể, nếu bạn phụ thuộc vào trình tạo bình thường (và tôi nghĩ bạn làm), trường hợp của bạn trở nên khó khăn hơn và tôi chưa bao giờ có một nghiên cứu điển hình tương tự. Nhưng, nếu bạn sử dụng các trình tạo lớp POCO bình thường, bạn có thể sử dụng một lớp cơ sở, hãy gọi nó là CEntity là lớp cơ sở cho mỗi lớp (bảng) khác của bạn.

Chúng ta có ở đó chưa? Không, tiếp tục với điều này, tôi thích sử dụng Pattern Repository, và bạn có thể làm cho điều đó kho generic (CEntity), ví dụ:

public class Repository<CEntity> where CEntity : class 
{ 
    public IQueryable<CEntity> GetAll() 
    { 
     return source.Where(p => p.isActive); 
    } 

} 

Và đây là làm thế nào để sử dụng nó:

Repository<Company> com = new Repository<Company>(); 
Repository<Employee> emp = new Repository<Employee>(); 

var coms = com.GetAll(); // will get all ACTIVE companies 
var emps = emp.GetAll(); // will get all ACTIVE employees 

Đây là đầu của tôi, nếu bạn có bất kỳ vấn đề khác, đặt chúng như ý kiến, vui mừng để giúp đỡ.

+0

Cảm ơn bạn đã trả lời nhanh LordCover. Tôi sử dụng phương pháp tiếp cận cơ sở dữ liệu đầu tiên. EF5.x DbContextGenerator có phải là trình tạo lớp POCO bình thường không? Nếu tôi không tìm thấy máy phát điện POCO bình thường ở đâu? Nhân tiện, trong ví dụ của bạn không có định nghĩa cho "nguồn". – cck

+0

Tôi biết, 'nguồn' chỉ là Bộ đối tượng là tập hợp các đối tượng. –

+0

Nhưng làm thế nào để chúng ta nói rằng nó có trường isActive? Trình biên dịch đưa ra một lỗi như "không có trường như vậy"? Tôi đoán tôi phải chuyển sang lớp Công ty, nhưng không có gì thay đổi, tôi sẽ phải làm điều đó cho tất cả các bảng của mình? – cck

1

Cũng giống như một địa điểm ưa thích, đây là chính xác làm thế nào tôi thực hiện các lớp dữ liệu của tôi, và tôi nghĩ rằng nó tuyệt vời :)

Tôi cũng giơ một kho ở giữa cũng nhưng khái niệm chung nên làm việc với hoặc không có.

Dưới đây là một số ví dụ về mã làm việc về cách tôi sử dụng phương pháp này trong blog của tôi đối với một số trường hợp sử dụng tương tự.

https://github.com/lukemcgregor/StaticVoid.Blog/blob/master/Blog/Data/Entities/Post/PostRepositoryExtensions.cs

Tôi đã phát hiện ra rằng nó làm cho một số mã đẹp thanh lịch mà vẫn không hạn chế những gì bạn có thể làm quá nhiều. Giống như tôi đã nói, tôi nghĩ rằng phương pháp này là tuyệt vời và thực sự khuyên bạn nên sử dụng nó.

+0

Cảm ơn Luke cho dự án ví dụ. Có điều oen tôi không hiểu (có thể nhiều hơn). Lớp bối cảnh cơ sở dữ liệu được tạo cho mỗi kho lưu trữ hay kho lưu trữ có chia sẻ một lớp bối cảnh cơ sở dữ liệu hay không (chỉ tạo một ngữ cảnh)? – cck

+0

Vâng, tôi cho rằng ví dụ của tôi phức tạp hơn một chút khi tôi sử dụng kho lưu trữ chung. Bên dưới có một DbContext (https://github.com/lukemcgregor/StaticVoid.Blog/blob/master/Blog/Data/BlogContext.cs), tuy nhiên bạn thực sự có thể thực hiện cùng một phương thức extention mà không cần sử dụng một kho lưu trữ nếu nó hoạt động tốt hơn cho bạn bằng cách mở rộng IQueriable hoặc IDbSet . –