2015-07-20 14 views
12

Chúng tôi đang học Khuôn khổ thực thể 6.1 (từ NuGet) khi chúng tôi di chuyển ra khỏi Linq2Sql. Chúng tôi có một số ít các bảng kết hợp hai bảng riêng biệt như được hiển thị bên dưới.Khuôn khổ thực thể 6 - Bảng thiếu chỉ có các khóa chính tham chiếu các bảng khác nhau

EF6 Cơ sở dữ liệu thế hệ đầu tiên

DB Diagram:

enter image description here

Schema Tổng quan:

enter image description here

Khi trong studio Visual, thư viện lớp trống, thực hiện một cơ sở dữ liệu đầu tiên EF6 Tệp EDMX, sơ đồ chỉ tạo TableA và TableC - TableB không được tạo ra.

enter image description here

Visual Studio Xem:

enter image description here

Bạn có thể thấy rằng chỉ TableA và TableC được tạo ra. Về mặt kỹ thuật, TableB đã được tạo ra, bởi vì bạn sẽ muốn có thể quản lý các tham chiếu đó.

Hiệp hội giữa A và C thể hiện trong sơ đồ:

enter image description here

tôi cảm thấy như tôi đang thiếu một lựa chọn, hoặc hiểu lầm một khái niệm then chốt của Entity Framework. Bất kỳ ý tưởng làm thế nào để có TableB thiếu tạo ra với T4? Tệp EDMX không hiển thị nó, nhưng vì một số lý do nó không được tạo ra thành tệp .CS với hai thuộc tính cho biết mối quan hệ.

Lý do chính chúng tôi cần điều này là chúng tôi đã mở rộng mẫu EF6 T4 để thêm một số mẫu nhà máy để phù hợp với các mô hình hiện có của chúng tôi. Bởi vì nó không tạo ra một lớp cho TableB, chúng ta không nhận được mã được tạo tự động mà chúng ta đang tìm kiếm.

Suy nghĩ/đề xuất? Cảm ơn.

+2

EF có thể hiểu rằng TableB không có ý nghĩa riêng và chỉ dành cho mối quan hệ nhiều-nhiều? – Disappointed

Trả lời

5

thực thể yếu hoặc tham gia các bảng sẽ không được tạo ra bởi EF, bạn cần phải cấu hình các mối quan hệ bằng tay qua API thông thạo hoặc sử dụng chú thích dữ liệu

Như đã trình bày trên trang web của Microsoft: theo nguyên tắc Mối quan hệ của:

Lưu ý: Nếu bạn có nhiều mối quan hệ giữa các loại giống nhau (ví dụ: , giả sử bạn xác định các lớp PersonBook, trong đó lớp Person chứa các điều khiển ReviewedBooksAuthoredBooks điều hướng thuộc tính và lớp Book chứa các thuộc tính AuthorReviewer điều hướng), bạn cần phải định cấu hình các mối quan hệ theo cách thủ công bằng cách sử dụng Chú thích dữ liệu hoặc API thông thạo. Để biết thêm thông tin , hãy xem Chú thích dữ liệu - Mối quan hệ và API lưu loát - Các mối quan hệ.

Tham khảo link này để biết thêm thông tin

CẬP NHẬT

Một cách giải quyết sẽ làm việc trong trường hợp EDMX (nhưng chi phí bảo trì) như sau:

  1. Tháo nước ngoài các khóa từ bảng kết nối trong cơ sở dữ liệu
  2. Cập nhật EDMX từ cơ sở dữ liệu
  3. Tái các phím nước ngoài trong bảng tham gia

workaround này sẽ làm việc miễn là bạn sẽ không cập nhật mẫu của bạn từ cơ sở dữ liệu một lần nữa.

giải pháp đề nghị, giữ cho mọi thứ vì nó được tạo ra bởi EDMX và tìm hiểu thêm về cách sử dụng vận hành crud cho trường hợp này bằng cách sử dụng liên kết sau đây đã được báo cáo "hữu ích" bởi người sử dụng '@TravisWhidden'

  1. Insert/Update Many to Many Entity Framework . How do I do it?
  2. https://www.youtube.com/watch?v=uMQwORSTGX4 (video)
+0

Có vẻ như sẽ hữu ích nếu tôi đã sử dụng phương pháp mã đầu tiên --- nhưng vì chúng tôi đang thực hiện "Thiết kế EF từ Cơ sở dữ liệu", tôi không thể tìm thấy trong xml EDMX, nơi có thể đặt chú thích dữ liệu hoặc chú thích dữ liệu. – TravisWhidden

+0

@TravisWhidden bạn có thể thực hiện giải pháp thay thế, xóa các khóa chính khỏi bảng kết nối và sau khi tạo bản in, đặt lại, và nếu mô hình không hoạt động do bảng không có khóa chính, hãy xóa một trong số chúng và thử – Monah

+0

Việc loại bỏ khóa chính không giúp được gì, nhưng việc loại bỏ các ràng buộc khoá ngoại đã làm. Tuy nhiên, sau khi đưa chúng trở lại và xem điều gì sẽ xảy ra khi bạn nhấn "cập nhật từ cơ sở dữ liệu", các liên kết trong trả về XML và khi bạn thêm một thực thể vào bảng, sau SaveChanges() nó ném một ngoại lệ do assoc hạn chế. Sẽ không hợp lý khi mong đợi bất kỳ nhà phát triển nào trong nhóm nhớ để xóa thủ công tất cả các liên kết bằng các bảng cặp nếu họ đã từng phải 'cập nhật' tệp EDMX. Vì vậy, mặc dù một giải pháp có thể, vẫn còn giữ cho một cái duy trì được nhiều hơn. – TravisWhidden

2

Như đã đề cập bởi @Hadi Hassan, EF sẽ không “phơi” hoặc nhận Bàn Relational được sáng tác độc quyền của đơn vị khác.

làm việc xung quanh:
Nếu bạn chỉ cần ‘ĐỌC’ dữ liệu bạn có thể

  1. Xác định một view trong Schema của bạn cho TableB.
  2. Sau đó, hãy thực hiện Model (.EDMX) Cập nhật từ DB (chọn Chế độ xem cập nhật)
  3. Bây giờ bạn có thể truy vấn dữ liệu TableB bằng Ngữ cảnh EF của mình.

Nếu bạn cần phải sửa đổi (Tạo, Update, Destroy) ghi trong bạn TableB

  1. Tạo thủ tục lưu trữ trong Schema của bạn, cho phù hợp.

  2. Nhập Procs của bạn như chức năng vào EF của bạn Mẫu

  3. Bây giờ bạn có thể gọi những chức năng từ mô hình Bối cảnh của bạn cho phần còn lại của hoạt động CRUD của bạn.

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