2009-09-01 37 views
7

Tôi có một hệ thống phân cấp thừa kế với thực thể Employee cơ sở và một số thực thể con cháu cho các loại nhân viên cụ thể. Tôi cần để có thể chuyển đổi một thực thể Employee cơ sở thành một thực thể cụ thể hơn (ví dụ: TemporaryEmployee) và từ một kiểu cụ thể hơn trở lại kiểu cơ sở (ví dụ: nếu một nhân viên không còn "tạm thời" nữa thì tôi muốn trường hợp đó Trong DB, đây chỉ là vấn đề thêm hoặc xóa một hàng từ bảng cho lớp con cụ thể (Tôi đang sử dụng bảng cho mỗi lớp). Tôi không thấy cách thực hiện điều này bằng cách sử dụng các cuộc gọi EFThay đổi loại thực thể (Entity Framework) là một phần của phân cấp thừa kế

Trả lời

4

Về mặt kỹ thuật, bạn có thể đạt được điều đó bằng cách sử dụng quy trình được lưu trữ. TPT không hỗ trợ nó.

Tuy nhiên, tôi hoàn toàn đồng ý với Craig. Trong cuốn sách lập trình cổ điển Các mẫu thiết kế (Addison-Wesley Professional), các tác giả thảo luận về thừa kế so với sáng tác và kết luận rằng người ta nên "ủng hộ thành phần thừa kế."

+0

Có, bây giờ tôi đã thực hiện điều này bằng cách sử dụng thủ tục được lưu trữ. Đây cũng là khuyến nghị từ MSFT: "Bạn không thể thực hiện điều này trong Khuôn khổ thực thể trực tiếp. Lựa chọn tốt nhất của bạn là viết các thủ tục được lưu trữ để thực hiện các chuyển đổi này" http://social.msdn.microsoft.com/Forums/ en-US/adodotnetentityframework/thread/860d7913-7baa-43e9-a2a7-83b25ad9c558 / –

7

Một trong các nguyên lý của OOP là các trường hợp không thể thay đổi kiểu của chúng. Hãy suy nghĩ: Bạn có thể làm điều này với các đối tượng .NET bình thường không? Dĩ nhiên là không. Bạn không thể chạy hết xung quanh quy tắc cứng và nhanh này hãy kiên trì họ với EF, hoặc là

Việc thêm một hàng vào DB không làm thay đổi kiểu chữ của một cá thể e, một trong hai; nó chỉ nằm ở EF về những gì bạn đã lưu. Trong miền quan hệ, bạn đang thêm một quan hệ, không thay đổi lớp của đối tượng, bởi vì miền quan hệ không biết về các đối tượng.

Vì vậy, dài và ngắn gọn này là việc sử dụng EF không thay đổi quy tắc .NET mà các trường hợp không thể thay đổi loại của chúng.

Bạn nên làm gì khi bạn cần thực hiện việc này? Vâng, hãy suy nghĩ về cách thức hoạt động trong miền vấn đề của bạn. Một nhân viên là một người. Tình trạng việc làm của họ có liên quan đến người đó, nhưng tình trạng của họ không thực sự là con người.

Sử dụng bố cục thay vì thừa kế. Tôi có lẽ sẽ mô hình này như là Person, với một tập hợp các cá thể Employment. Khi tình hình việc làm của một người thay đổi, bạn có thể chỉ định ngày dừng/chấm dứt cho các hồ sơ cũ và thêm hồ sơ mới cho công việc mới.

Tôi tình cờ đọc this blog post sáng nay, có thể là thực phẩm bổ sung cho ý nghĩ.

Chỉnh sửa để thêm Nếu bạn làm việc này bằng cách thực hiện thủ tục lưu sẵn DB, đảm bảo không ai thực sự sử dụng hệ thống tại thời điểm bạn thực thi nó. Bởi vì điều này là hoàn toàn bất hợp pháp trong không gian đối tượng .NET, Entity Framework giả định rằng nó không thể xảy ra. Nếu bạn phá vỡ Entity Framework và thực hiện nó, và người dùng sẽ có ObjectContext trực tiếp tại thời điểm đó thì ObjectContext này sẽ không đồng bộ với cơ sở dữ liệu theo cách bảo vệ đồng thời lạc quan bình thường trong Entity Framework. . Bạn sẽ không làm hỏng dữ liệu, nhưng người dùng với ObjectContext đang hoạt động có thể thấy một số lỗi cực kỳ lạ.

+1

Nhận xét hay. Thừa kế có vẻ tự nhiên hơn ở đây mặc dù nó cho phép tôi xác định mối quan hệ giữa các loại cụ thể hơn. Có, bài đăng trên blog thú vị mà bạn liên kết cũng - thay đổi thực thể thành loại cơ sở là hình thức xóa - có thể tôi không nên làm điều đó ... –

+0

Giới thiệu về bản chỉnh sửa được thêm vào: EF không và không thể giả định rằng nó là quá trình duy nhất cập nhật cơ sở dữ liệu. Trong thực tế, trong hầu hết các trường hợp, nó không phải là - bạn có thể ít nhất có nhiều phiên bản của hoạt động ObjectContext đối với cùng một DB (ví dụ: một người dùng trong trường hợp ứng dụng web). –

+0

Tôi đã không nói rằng EF giả định rằng nó là quá trình duy nhất cập nhật DB, bởi vì đó sẽ là sai.Tôi nói rằng nó trả về các thông báo lỗi lạ khi một số quá trình bên ngoài "làm hỏng" cơ sở dữ liệu. Và EF xem xét việc thay đổi kiểu của một trường hợp tham nhũng, vì những lý do rất tốt. Đây chỉ là một vấn đề nếu (1) có một bối cảnh đối tượng hoạt động với đối tượng trong bộ nhớ, sau đó (2) một số người dùng khác "thay đổi kiểu", sau đó (3) bối cảnh ban đầu làm điều gì đó với đối tượng. EF sẽ phát hiện vấn đề và trả về một lỗi kỹ thuật cao. Như tôi đã nói, nó không phải là đa người dùng an toàn để làm điều này. –

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