2011-10-11 22 views
5

Tôi đang đánh giá Khung thực thể cho dự án dựa vào cơ sở dữ liệu cũ. Cơ sở dữ liệu được thiết kế khá tốt và đã được quyết định rằng chúng tôi sẽ sử dụng phương pháp Cơ sở dữ liệu-Đầu tiên. Ứng dụng sẽ là WinForms dựa trên nhưng tôi muốn lập kế hoạch trước và đưa ASP.Net vào tài khoản cũng như nó có thể sẽ được yêu cầu bởi quản lý tại một số điểm và tôi muốn sử dụng lại DAL.Bối rối về máy phát điện cho Khung thực thể 4.1

Bây giờ, tôi hiểu rằng Entity Framework cung cấp nhiều cách cho các đối tượng thực thể được tạo ra:

  • Đối tượng có nguồn gốc từ EntityObject
  • POCO (ObjectContext)
  • POCO (DbContext)
  • Tự -Thực thể theo dõi (STE)

Tôi đã cố gắng so sánh ba phương pháp tiếp cận và tôi đã từ d ra điều này cho đến nay.

Mẫu EntityObject T4 là mẫu giàu nhất trong số tất cả. Ví dụ: , nó đặt các nhận xét từ Mô hình thực thể vào các nhận xét XMLDoc ở đầu mỗi lớp và mỗi thuộc tính của thực thể, điều này khá tốt và hữu ích về khả năng bảo trì mã. Không ai trong số các máy phát điện khác hỗ trợ điều này ra khỏi hộp (mặc dù tôi hiểu rằng có thể sửa đổi các mẫu T4, nhưng nó rõ ràng đòi hỏi một số công việc). Mặt khác, API DbContext có phần đẹp hơn.

Các kiểu dẫn xuất EntityObject cung cấp sự kiện mà bạn có thể móc vào khi thuộc tính của một thực thể thay đổi, điều này rất hữu ích để triển khai logic nghiệp vụ.

Tôi hiểu rằng POCO tự nhiên hơn cho điều này, nhưng máy phát T4 sẽ ghi đè tất cả các thay đổi của tôi mỗi khi mô hình thay đổi. Chắc chắn, các POCO được tạo ra là các lớp từng phần nhưng theo hiểu biết của tôi, không thể ghi đè một thuộc tính đã được định nghĩa trong một lớp, vì vậy tôi không chắc chắn cách thực hiện logic nghiệp vụ trong chúng được thực hiện như thế nào?

Rất nhiều người dường như ghét các lớp dẫn xuất EntityObject, thích cách tiếp cận POCO hơn, nhưng có vẻ như tôi đang mất rất nhiều tính năng hữu ích do EntityObjects cung cấp, bằng cách tuyến đường POCO. Xem xét sở thích mạnh mẽ chung về các đối tượng POCO, tôi có thể hiểu nhầm một điều gì đó do đó câu hỏi của tôi.

Cuối cùng, trình tạo nào phù hợp nhất trong môi trường ASP.Net? Tôi lo lắng về những thay đổi thực thể của tôi bị ngừng theo dõi? Các thực thể tự theo dõi có hữu ích hơn trong trường hợp này hay chúng chỉ có giá trị với các dịch vụ web (mà tôi có thể sẽ không sử dụng)?

Rất cám ơn trước.

Trả lời

7

Nếu bạn muốn sử dụng EF 4.1, các tùy chọn của bạn chỉ là DbContext Generator. Tất cả các trình tạo khác (POCO, EntityObject và STEs) đều dành cho ObejctContext API (EF 4.0). Tôi mô tả sự khác biệt giữa các máy phát điện here.

Trong trường hợp máy phát EntityObject của bạn có thể được sử dụng cho WinForms nhưng nó sẽ là cồng kềnh đối với giải pháp ASP.NET nơi POCOs tốt hơn vì ứng dụng ASP.NET được tách rời kịch bản - bạn sẽ phải đối phó với thay đổi theo dõi trong ASP.NET anyway .

Mục đích của STE được mô tả here nhưng chúng không hữu ích trong WinForm nơi bạn có thể sử dụng các thực thể được đính kèm trực tiếp hoặc ASP.NET trong đó demands to store them giữa các yêu cầu ở trạng thái xem.

Bất kỳ logic nghiệp vụ nào bạn muốn đưa vào thực thể trực tiếp phải được mã hóa bằng trình tạo T4 nếu không nó sẽ bị ghi đè sau mỗi thế hệ. Mỗi tính năng của máy phát điện dựa trên EntityObject mà bạn đề cập có thể được triển khai trong máy phát POCO/DbContext.

+1

Cảm ơn. Điều đó rất hữu ích. Bởi "Bất kỳ logic nghiệp vụ nào bạn muốn đưa vào thực thể trực tiếp phải được mã hóa trong trình tạo T4", bạn có nghĩa là tôi cần phải sửa đổi mẫu T4 để tạo ra các sự kiện tương tự như On [Property] Thay đổi EntityObjects không? Tôi đã thực hiện một số thay đổi đối với T4 một lần và tôi không thể nói đó là một trải nghiệm thú vị. Xem xét điều này, tôi ngạc nhiên khi không nhìn thấy nhiều tập lệnh EF T4 được chia sẻ xung quanh, nhưng chỉ có MS. Ngoài ra, tôi đã lo ngại rằng các sự kiện có thể sẽ không được nâng lên trên một môi trường ASP.Net, sẽ họ (khi dữ liệu được đăng trở lại máy chủ)? –

+0

"Bất kỳ logic nghiệp vụ nào bạn muốn đưa vào thực thể trực tiếp phải được mã hóa trong bộ tạo T4 nếu không nó sẽ bị ghi đè sau mỗi thế hệ" <---- Điều này không đúng. Bạn cần phải đặt logic nghiệp vụ trong một tệp lớp ** một phần riêng biệt ** và nó sẽ được giữ nguyên mà không có bất kỳ vấn đề nào. Tất cả các máy phát điện trên tạo ra một phần các lớp đã có. – Bobson

+0

@Bobson: Bạn đã đọc câu hỏi chưa? Chúng tôi đang thảo luận về logic bổ sung trong các thuộc tính được tạo ra. Vẫn còn những tình huống mà một phần hoặc thậm chí một phần phương pháp không giúp đỡ. –

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