2009-08-06 32 views
13

Giả sử, tôi có 2 lớp trong mô hình: Người dùng (ánh xạ tới bảng USERS) và PrivilegedUser (kế thừa người dùng, thông tin bổ sung được lưu trữ trong bảng PRIVILEGEDUSERS).Entity Framework: Thừa kế, thay đổi kiểu đối tượng

Bây giờ, tôi có một hàng trong USERS (và trường hợp Người dùng) và cần phải chuyển đổi người dùng đó thành PrivilegedUser (tức là tạo bản ghi trong PRIVILEGEDUSERS có cùng Id). Có cách nào để thực hiện việc này mà không cần Xóa/Chèn không?

Vấn đề là bạn không có đại diện PRIVILEGEDUSERS trong mô hình, vì vậy bạn không thể tạo chỉ một phần của PrivilegedUser.


Đó chỉ là một ví dụ. PrivilegedUser có thể có một số giảm giá hoặc quản lý cá nhân hoặc bất cứ điều gì ngoài để tài sản người dùng bình thường. Đồng thời, có các bảng khác cần tham khảo người dùng bất kể loại người dùng cụ thể. Tôi đã triển khai nó bằng chế độ kế thừa Table-per-Type. Ở cấp độ cơ sở dữ liệu, nó rất đơn giản để chuyển đổi người dùng từ kiểu này sang kiểu khác (bạn chỉ cần chèn hoặc xóa bản ghi từ bảng mở rộng). Nhưng trong EF bạn chỉ có UserSet lưu trữ cả đối tượng User và PrivilegedUser. Đó là lý do tại sao tôi yêu cầu có thể thay thế đối tượng người dùng hiện có với PrivilegedUser giữ Id hiện tại và không xóa bản ghi khỏi bảng USERS.

Trả lời

0

Có vẻ như bạn đã có hai bảng đại diện cho người dùng.

Sẽ không tốt hơn nếu có bảng Người dùng (đối với tất cả người dùng) và sau đó là bảng UserPrivileges, đại diện cho những gì họ được phép làm? Bằng cách này, không cần xóa/Chèn và bạn chỉ có thể tham chiếu một bảng cho người dùng.

Bảng thứ ba có thể được sử dụng để thể hiện các đặc quyền thực tế.

Người dùng
Id Tên đăng nhập ...

UserPrivileges
UserId PrivilegeId

Ưu đãi
Id Mô tả

+1

Điều này là chính xác. Một thể hiện nên/không bao giờ có thể thay đổi kiểu. Vậy điều gì sẽ xảy ra khi người dùng trở thành đặc quyền hoặc không có đặc quyền? –

+0

@Craig, có tin gì không? Tôi chạy vào cùng một câu hỏi. – Shimmy

+0

@Shimmy, "tin tức?" Tin tức gì? Nếu bạn nghĩ rằng đối tượng của bạn cần phải thay đổi loại, sau đó bạn có thể lạm dụng thừa kế. @ DanDan của câu trả lời vẫn là một ý tưởng tốt hơn. –

3

Không bạn không thể.

Như được giải thích bởi this article, EF (3.5) không hỗ trợ tính năng này. Bạn phải sử dụng thủ tục lưu sẵn để thực hiện việc này.

1

Bạn cần thay đổi chế độ xem thế giới của mình. Quan điểm của bạn là bạn có người dùng chuẩn với đặc quyền chuẩn và người dùng siêu có đặc quyền bổ sung. Các đặc quyền không được liệt kê, chúng là ngầm định.

Quan điểm thế giới mới là bạn duy trì danh sách tất cả các đặc quyền, cả tiêu chuẩn và siêu và sau đó trong bảng ánh xạ, bạn tạo nhiều bản đồ mà người dùng có đặc quyền nào. Khi người dùng được cấp đặc quyền siêu, bạn chỉ cần thêm ánh xạ cho các đặc quyền thích hợp vào bảng ánh xạ. Bạn không cần một lớp PrivilegedUser, chỉ là một danh sách các đặc quyền trong lớp User. Các đặc quyền có thể là tiêu chuẩn hoặc siêu.

0

Như đã nói, bạn không thể. Bằng thủ tục được lưu trữ hoặc bằng truy vấn chèn/cập nhật tùy chỉnh. Tôi có vấn đề tương tự, bây giờ tôi đang sử dụng giải pháp mà tôi mô tả trong câu trả lời này: https://stackoverflow.com/a/28380804/2424989

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