2012-04-23 33 views
8

Trong ứng dụng asp.net mvc 3 của tôi, tôi đang sử dụng mẫu kho lưu trữ. Tôi có 3 thực thể, Công ty, Quốc gia, Thành phố. Mỗi người trong số họ có kho lưu trữ riêng của họ. Công ty thực thể đã thành lập các khóa ngoại quốc được thành lập và thành lập. Hiện tại, tôi muốn hiển thị chi tiết công ty. Trong quan điểm này, tôi muốn xem chi tiết Công ty cũng như tên CreatedCountry và tên SuccessCity. Theo quan điểm của tôi, tôi phải xử lý điều này với một loại truy vấn JOIN. Nhưng tôi bị mắc kẹt tại cách để đạt được điều này trong mô hình kho lưu trữ. Làm thế nào tôi có thể xử lý JOIN này trong mẫu kho lưu trữ?Làm cách nào tôi có thể truy vấn các bảng chéo với Mẫu Kho lưu trữ?

Cảm ơn bạn.

Trả lời

4

Kho lưu trữ phải có giao diện dựa trên tác vụ. Điều này có nghĩa là ORM, tham gia vv nằm bên trong kho lưu trữ. Ứng dụng chỉ thấy một giao diện whtch trả về một đối tượng mà nó có thể sử dụng.

Điều này có nghĩa là bạn không tạo một kho lưu trữ quanh một bảng (nó đánh bại khá nhiều mục đích). Trong kịch bản của bạn tôi đề nghị bạn có (ít nhất) 2 kho: một sẽ xử lý tất cả mọi thứ liên quan đến việc cập nhật mô hình và người kia sẽ chỉ phục vụ đọc (truy vấn).

Điều này có nghĩa là kho lưu trữ truy vấn sẽ chỉ trả lại dữ liệu bạn muốn (về cơ bản, nó trả về các bit của mô hình xem). Tất nhiên, các bảng thực tế và các tham gia là một chi tiết thực hiện của kho lưu trữ.

+0

"Điều này có nghĩa là bạn không tạo một kho lưu trữ quanh một bảng (nó khá nhiều đánh bại mục đích). " Theo như tôi biết, tôi phải tạo một kho lưu trữ cho từng thực thể. Từ nhận xét của bạn, tôi nghĩ rằng tôi phải thêm một kho lưu trữ khác sẽ xử lý các truy vấn phức tạp. Đúng? – SherleyDev

+0

Không :). Bạn không phải 'tạo' một kho lưu trữ cho mỗi thực thể. Kho lưu trữ cơ bản ẩn tất cả mọi thứ cơ sở dữ liệu liên quan đến phần còn lại của ứng dụng. Bên trong kho lưu trữ, bạn có thể sử dụng các thực thể, EF hoặc Nhibernate, nó không quan trọng. Repositoryu sử dụng nội bộ orm, trong trường hợp của bạn là các thực thể và sau đó trả về các đối tượng mà ứng dụng hiểu được. Bản thân các thực thể đã là một sự trừu tượng được kho lưu trữ sử dụng. – MikeSW

+0

Trong hướng dẫn sau nó nói "Trong hướng dẫn này, bạn sẽ triển khai một lớp kho lưu trữ cho mỗi loại thực thể." Tôi đã theo dõi nó. http: //www.asp.net/mvc/hướng dẫn/bắt đầu-với-ef-sử dụng-mvc/triển khai-the-kho-và-đơn vị-của-công việc-mẫu-in-an-asp-net-mvc-ứng dụng – SherleyDev

2

Không xây dựng mô hình kho lưu trữ của bạn theo cách ngăn cản tham gia! Điều này thường có nghĩa là sử dụng cùng một ngữ cảnh ORM (DataContext/ObjectContext) cho tất cả các cá thể được liên kết với yêu cầu HTTP hiện tại.

Tôi coi đó là một mẫu chống để có một IRepository chung vì truy cập cơ sở dữ liệu hiếm khi bị ràng buộc với một loại thực thể duy nhất cùng một lúc.

Bạn có thể xem DataContext/ObjectContext là một kho lưu trữ của chính nó.

Lời khuyên cuối cùng: Nếu bạn không biết trừu tượng kho lưu trữ là gì tốt - đừng sử dụng.

+0

Tôi không đồng ý với một điều: rằng Ngữ cảnh dữ liệu nên được coi là một kho lưu trữ. Trong khi DC tóm tắt truy cập db và sql, nó vẫn gắn liền với một rdbms và IMO nó là một trừu tượng bị rò rỉ ở mức tốt nhất. – MikeSW

+0

Nếu một ORM là một trừu tượng bị rò rỉ, làm thế nào rò rỉ là một kho lưu trữ tùy chỉnh sau đó? Nó là một cái rây. Đồng thời nó ngăn cản bạn truy cập toàn bộ sức mạnh của ORM (đó là bản chất của một trừu tượng). – usr

+0

Kho lưu trữ được thiết kế phù hợp không bị rò rỉ vì nó không hiển thị chi tiết triển khai như ORM. Kho lưu trữ sử dụng toàn bộ sức mạnh của ORM, đó là công việc của nó, Nó không phải là công việc của phần còn lại của ứng dụng để biết hoặc sử dụng orm. Vui lòng xem bài đăng này http://www.sapiensworks.com/blog/post/2012/04/15/The-Repository-Pattern-Vs-ORM.aspx – MikeSW

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