15

Tôi đang nghĩ về việc bắt đầu một dự án mới sử dụng EF 4 và trải qua một số bài viết, tôi thấy một số bài viết về EF với mô hình kho và đơn vị làm việcEntity Framework + Kho + Đơn vị làm việc

(http://tdryan.blogspot.com/2011/03/another-entity-framework-4-repository_15.htmlhttp://blogs.msdn.com/b/adonet/archive/2009/06/16/using-repository-and-unit-of-work-patterns-with-entity-framework-4-0.aspx)

Tôi đang sử dụng cái đầu tiên (part1, part2 và part3). Chúng rất giống nhau.

Tôi là người mới trong trường hợp này. Tôi đang bối rối giữa hai bài đăng này. Tôi đã tạo ra mọi thứ nhưng tôi không biết làm thế nào tôi có thể bắt đầu sử dụng ngữ cảnh và thêm một số thực thể vào nó. Tôi đã đăng liên kết thứ hai vì đã đăng một cách để triển khai nó. Các ObjectContext có nguồn gốc từ IUnitOfWork, vì vậy tôi nhầm lẫn để chọn cái nào trong số hai là tốt hơn để sử dụng.

Trả lời

1

Nếu dự án của bạn là web làm cho trình xử lý bắt đầu giao dịch theo yêu cầu và kết thúc giao dịch ở bước cuối cùng.

Tôi nghĩ rằng một ví dụ đơn giản hơn nhiều có thể được tìm thấy ở đây: https://github.com/ayende/CourseSampleApp Ngoài ra, bạn có thể tìm thấy các mẫu khác trên nhibernate có thể đáp ứng nhu cầu của bạn.

32

Câu hỏi của bạn không ngu ngốc! Bắt đầu với UnitOfWork và các mẫu Repository mất một chút thời gian.

Trước tiên, để có được một số quyền hạn. A UnitOfWork đóng gói một tập hợp các hành động và nhóm chúng lại với nhau. Vì vậy, bạn có thể ví dụ như tạo ra một khách hàng, một sản phẩm và một thứ tự tương ứng trong một nhóm hợp lý.

A Repository cung cấp cho bạn một điểm truy cập duy nhất vào các thực thể và phần lớn thời gian có một số phương pháp cụ thể để truy xuất dữ liệu.

Nhiều kho lưu trữ có thể được sử dụng trong một giao dịch duy nhất, đó là lý do tại sao chúng chia sẻ UnitOfWork.

Trong ví dụ bạn đã đăng, các tệp T4 tạo ra một số giao diện Repository. Một là chỉ đọc với các phương thức để chọn các thực thể nhưng các phương thức khác Repository có các phương thức như AddDelete. Vì vậy, nếu bạn muốn thêm một thực thể, trước tiên bạn cần xây dựng một UnitOfWork và sau đó tạo nhanh Repository cho loại thực thể bạn đang làm việc với (CustomerRepository hoặc ProductRepository chẳng hạn). Sau đó, bạn có thể sử dụng phương thức Add để thêm đối tượng vào một số Repository. Khi bạn làm việc xong với kho lưu trữ của mình, bạn sẽ gọi số UnitOfWork.Commit() để lưu các thay đổi của mình vào cơ sở dữ liệu.

IUnitOfWork unitOfWork = new EFUnitOfWork(); 

IRepository<Customer> customerRepository = new CustomerEFRepository(unitOfWork); 

Customer c = new Customer(); 

// init customer 

customerRepository.Add(c); 
unitOfWork.Commit(); 

Trong ví dụ bạn đã đăng, Dependency Injection with StructureMap được sử dụng. Đây là một chủ đề hoàn toàn khác, nhưng điều đó có nghĩa là bạn không xây dựng trực tiếp số UnitOfWorkRepository nhưng chúng được 'tiêm' vào mã của bạn bằng cách sử dụng một số cấu hình bạn đã thiết lập.

+1

Tôi đã làm việc trên mẫu C# Repo/Unit of Work của riêng mình trong một thời gian và tôi đã luôn tự hỏi liệu nó có đúng hay không. Đây chính xác là cách tôi đã thực hiện nó bằng cách sử dụng Ninject tiêm uow và kho lưu trữ vào bộ điều khiển mvc. Đơn vị làm việc của tôi giữ một bản sao của lớp DbContext được chia sẻ với repos.Thought bạn giải thích nó tốt :-) –