2010-06-03 43 views
5

Tôi có một bảng Trang và một bảng Xem. Có một mối quan hệ nhiều-nhiều giữa hai thông qua một bảng PageView. Thật không may tất cả các bảng này cần phải có các phím tổng hợp (vì lý do kinh doanh).Ánh xạ các khóa ngoài tổng hợp trong mối quan hệ nhiều-nhiều trong khung Entity

  • Trang có một khóa chính của (PageCode, phiên bản),
  • View có một khóa chính của (ViewCode, phiên bản).
  • PageView rõ ràng là đủ có PageCode, ViewCode và Version.
  • Các FK trang là (PageCode, phiên bản) và FK để xem là (ViewCode, Version)

Làm cho cảm giác và các công trình, nhưng khi tôi cố gắng để ánh xạ này trong khuôn khổ Entity tôi nhận được

Lỗi 3021: vấn đề trong lập bản đồ mảnh ...: Mỗi phòng trong số cột sau trong bảng lần xem trang ánh xạ tới nhiều thuộc tính bên khái niệm: PageView.Version được ánh xạ tới (PageView_Association.View.Version, PageVi ew_Association.Page.Version)

Vì vậy, rõ ràng đủ, EF có khiếu nại về cột Phiên bản là thành phần chung của hai khóa ngoại.

Rõ ràng là tôi có thể tạo cột PageVersion và ViewVersion trong bảng kết nối, nhưng loại đó đánh bại điểm của ràng buộc, tức là Trang và Chế độ xem phải có cùng giá trị Phiên bản.

Có ai gặp phải điều này không và tôi có thể làm được gì không? Cảm ơn!

Trả lời

3

Sau nhiều lần đọc và xáo trộn, đây chỉ là giới hạn của nhà thiết kế và người xác thực EF khi làm việc với nhiều mối quan hệ.

1

Cân nhắc sử dụng nHibernate? :) - hoặc ít nhất là cho bất cứ điều gì nhiều hơn tham gia đơn giản trong DB của bạn. Im làm việc với EF4 và nó dường như không đủ trưởng thành cho các đồ thị dữ liệu phức tạp IMO, tại thời điểm này. Hy vọng rằng nó sẽ đạt được điều đó mặc dù!

+1

4 năm sau và EF vẫn đang cố bắt kịp. http://entityframework.codeplex.com/workitem/864 – granadaCoder

6

Tôi không biết giải pháp trong khung thực thể cho vấn đề này, nhưng giải pháp có thể là thêm cột khóa chính vào bảng của bạn và thêm một ràng buộc duy nhất trên các trường bạn muốn hoạt động như khóa tổng hợp. Bằng cách này, bạn đảm bảo tính duy nhất của dữ liệu của mình, nhưng vẫn có một cột khóa chính. lập luận ủng hộ con có thể được tìm thấy dưới chủ đề này: stackoverflow question

Cheers

+0

Cảm ơn bạn đã liên kết, một số thảo luận hay ở đó. Tôi không có tùy chọn xem xét thiết kế cơ sở dữ liệu tại thời điểm này, nhưng tôi quan tâm hơn đến việc liệu EF có thể làm việc với những gì tôi có. Tôi thích câu trả lời của bạn và là những gì tôi đã suy nghĩ khi lần đầu tiên tôi gặp vấn đề +1 –

2

tôi sẽ viết rằng bạn nên sử dụng một chìa khóa thay thế, nhưng tôi không nghĩ rằng điều này sẽ thực sự giúp bạn. Bảng kết nối thực thi quy tắc nghiệp vụ dựa trên các thuộc tính lôgic của các thực thể - các thuộc tính giống nhau này sẽ được lưu trữ trong bảng kết nối ngay cả khi Trang và Chế độ xem được tăng cường với các khóa thay thế.

Nếu bạn đang thực thi trên máy chủ hỗ trợ các ràng buộc, bạn có thể tách phiên bản thành PageVersion và ViewVersion và thêm một ràng buộc hai giá trị này bằng nhau hoặc sử dụng trình kích hoạt INSERT/UPDATE để thực thi điều này.

Tôi có thể đã hiểu sai ý định, nhưng tôi cảm thấy có điều gì đó có vẻ không phù hợp với thiết kế này. Tôi không thể tưởng tượng làm thế nào phiên bản sẽ làm việc như các trang và quan điểm được thay đổi và các phiên bản mới được tạo ra. Nếu thay đổi một trang có nghĩa là nó nhận được một phiên bản mới, thì nó cũng sẽ gây ra các phiên bản mới của tất cả các lượt xem của nó, ngay cả đối với các lượt xem không thay đổi trong phiên bản đó.Tương tự, nếu một lượt xem trong trang thay đổi, phiên bản của chế độ xem thay đổi, có nghĩa là phiên bản của trang cũng phải thay đổi và tất cả các chế độ xem khác trong trang đó, vì phiên bản trang và chế độ xem phải khớp nhau. Điều này có vẻ đúng không?

+0

Có, bạn chính xác. Chế độ xem mới có nghĩa là một Phiên bản mới, có nghĩa là một Trang mới. Nói cách khác, mỗi Phiên bản phải có bộ Trang và Chế độ xem riêng. –

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