9

Tôi đang cố gắng hiểu ánh xạ kế thừa trong EF4.Khuôn khổ thực thể 4 - Thừa kế

cơ sở dữ liệu của tôi có hai bảng với cấu trúc sau:

PersonCategory Bảng:

  • CategoryID (int) (identity) (PK)
  • CategoryType (nvarchar (50))

Bảng người

  • PersonID (int) (identity) (PK)
  • CategoryID (FK từ bảng PersonCategory)
  • Tên (nvarchar (50))
  • Mô tả (nvarchar (max))

bảng PersonCategory có bốn mục mỗi đại diện cho một thể loại - Sinh viên, CourseInstructor, Nhân viên và Cố vấn.

Từ đọc articles trực tuyến Tôi nghĩ Bảng mỗi phân cấp sẽ là mô hình phù hợp cho trường hợp này. Vì vậy, trong EF4, tôi đã tạo ra bốn thực thể (Student, CourseInstructor, Staff và Advisor) mỗi kế thừa từ bảng Person. Sau đó tôi ánh xạ từng người trong số họ vào bảng Person và thêm một điều kiện cho mỗi người (ví dụ: CategoryID = 1 cho thực thể Sinh viên và CategoryID = 2 cho thực thể Nhân viên) để phân biệt với những người khác. Tôi cũng đã loại bỏ thuộc tính CategoryID từ bảng Person và biến nó thành lớp trừu tượng. Nhưng tôi nhận được lỗi sau vì tôi đã xóa thuộc tính CategoryId từ bảng Person.

Lỗi 3015: Sự cố trong phân đoạn bản đồ bắt đầu từ dòng 101, 108, 114, 120, 126, 133: Ràng buộc khóa ngoại 'FK_Person_PersonCategory' từ bảng Person (CategoryID) thành bảng PersonCategory (CategoryID) :: Không đủ ánh xạ : Khóa ngoài phải được ánh xạ tới một số AssociationSet hoặc EntitySets tham gia vào một hiệp hội khóa ngoài ở phía khái niệm.

Thứ nguyên bảng có phải là mô hình phù hợp cho trường hợp này không? Nếu không thì tôi nên tiếp cận kịch bản này như thế nào trong EF4?

Trả lời

5

Sử dụng cột phân biệt đối xử trong các liên kết có vấn đề. Xem: -

http://social.msdn.microsoft.com/Forums/en/adodotnetentityframework/thread/24380ee6-4753-46a2-a3ed-b1cb2e2d161c

"Điểm mấu chốt là một cột đó sẽ hoạt động như phân biệt không thể được ánh xạ tới một assocation trừ khi nó particpates trong tình trạng không null."

+0

Cảm ơn con trỏ. Tôi hiểu điểm giải thích. Tôi có thể giải thích điều này vì EF4 không thể xử lý tình huống này? Bởi vì trong mô hình thực thể của ứng dụng của tôi, tôi muốn cả hai bảng có mặt với một liên kết. Làm thế nào tôi sẽ tiếp cận kịch bản này? – muruge

0

Đối với Bảng mỗi Hierarchy, một bảng duy nhất chứa tất cả các cột cho tất cả các loại. Bạn có hai bảng, vì vậy tôi ngay lập tức nghi ngờ.

Nếu truy cập Bảng mỗi loại, thì điều đó cũng không đúng.Bạn chỉ có thể có hai loại, cơ sở và có nguồn gốc, với bảng PersonCategory cung cấp dữ liệu cho các giá trị thuộc tính của kiểu có nguồn gốc. Tuy nhiên, điều này sẽ cần phải có PersonID là chìa khóa nước ngoài, mà nó không.

Cá nhân, tôi nghĩ bạn không cần phân mảnh các thực thể của mình thành các loại khác nhau. Bạn có thể ánh xạ tất cả các cột từ cả hai bảng đến một thực thể hoặc nếu có thể, hãy thay đổi lược đồ cơ sở dữ liệu để phù hợp với nhu cầu của bạn tốt hơn.

Tôi khuyên bạn nên làm việc với cơ sở dữ liệu thử nghiệm trống và thực hiện thiết kế TPT và TPH đầu tiên và xem lược đồ mà EF xây dựng cho thiết lập mong muốn của bạn.

Luke