2012-03-22 25 views
5

vài ngày trước, tôi đọc hướng dẫn về các mẫu GenericRepository và Unit Of Work http://www.asp.net/mvc/tutorials/getting-started-with-ef-using-mvc/implementing-the-repository-and-unit-of-work-patterns-in-an-asp-net-mvc-application. Tôi sử dụng các biểu mẫu web và tôi đã cài đặt gói CTP4 EntityFramework. (Tôi không thể sử dụng EF 5).EntityFramework 4, DbSet và ObjectContext

Tôi muốn mã kho chung cho dự án của tôi, nhưng tôi đã bị mắc kẹt tại dòng này:

this.dbSet = context.Set<TEntity>(); 

Tôi biết rằng dòng này không làm việc vì một sử dụng ObjectContext trong dự án của tôi và cơ sở dữ liệu tiếp cận đầu tiên. Làm thế nào tôi có thể đối phó với nó? Tôi có thể mã chung kho lưu trữ mà không cần di chuyển đến mã đầu tiên (mà không phải là một lựa chọn trong trường hợp của tôi)?

Trả lời

7

Đây là tương đương cho ObjectContext:

this.dbSet = context.CreateObjectSet<TEntity>(); 

Bây giờ điều này tạo ra một ObjectSet<TEntity> chứ không phải là một DbSet<TEntity>, nhưng đối với mô hình của bạn, bạn có thể sử dụng nó trong cùng một cách.

CẬP NHẬT

Lớp ObjectSet không có một phương pháp hữu ích như thế phù hợp với phương pháp Find() của DbSet. Để "Lấy chìa khóa", bạn sẽ cần phải xây dựng một EntityKey và sử dụng ObjectContext.GetEntityByKey(), tiếc là đó không phải là một điều thực sự đơn giản để làm.

Thực sự không phải là cách đơn giản để giải quyết vấn đề này, mà tôi đã tìm thấy. Trong trường hợp của tôi, những gì tôi đã làm là căn cứ tất cả các thực thể của tôi từ một lớp chung (sử dụng các mẫu tùy chỉnh T4 để tạo ra các lớp từ mô hình). Và sau đó tôi có thể thêm một hạn chế chung để kho của tôi, như:

public class MyRepository<TEntity> where TEntity : MyEntityBaseClass 

và sau đó lớp cơ sở chung tôi có một Id lĩnh vực được thừa hưởng bởi tất cả các đối tượng để tôi có thể chỉ đơn giản là có thể làm:

return myObjectSet.SingleOrDefault(x => x.Id == myId); 

Tôi chắc chắn có những cách tiếp cận khác, đó có thể là một chủ đề tốt cho một câu hỏi khác.

+0

Cảm ơn bạn đã trợ giúp. Bây giờ điều này tạo ra một ObjectSet thay vì một DbSet , nhưng đối với mẫu của bạn, bạn có thể sử dụng nó theo cách tương tự. Tôi gặp sự cố với phương pháp tìm kiếm trong dòng này: dbSet.Find (id); Làm thế nào tôi có thể mã này bằng cách sử dụng ObjectSet? – mrrobot

+0

vì vậy nếu Tìm theo Id trong ObjectSet là khó khăn như vậy tại sao bạn không sử dụng DbContext? Tôi tự hỏi phương pháp nào tôi nên sử dụng, hãy thử tạo phương thức tìm kiếm như bạn hoặc có lẽ tôi nên sử dụng DbContext? Tôi đã không viết nhiều mã cho đến nay trong dự án này, vì vậy có lẽ tốt hơn nên sử dụng DbContext? Bạn có thể đưa ra ý kiến ​​của bạn về nó? Cảm ơn – mrrobot

+0

Vào thời điểm tôi bắt đầu đăng ký, EF Code First chưa được phát hành. Dựa trên câu trả lời của Ropstah, có vẻ như có các khuôn mẫu bạn có thể sử dụng để tạo ra các lớp kiểu Code First cho các ứng dụng First Model hoặc Database First. Tôi chưa bao giờ thử phương pháp đó, vì vậy tôi thực sự không thể nói được liệu nó có hiệu quả hay không. – CodingGorilla

4

1. Bạn muốn thêm DbContextGenerator mẫu để mẫu visual studio của bạn:

DbContextGenerator template

2. Sau này chắc chắn rằng bạn rõ ràng ra công cụ thế hệ mặc định trong hồ sơ .edmx của bạn.

Code generation tool

3. Bây giờ bạn có thể thực hiện các mô hình GenericRepository như bạn muốn.

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