2009-09-02 36 views
6

LINQ cho đến nay đã được đáng kể thanh lịch, nhưng để thực hiện các truy vấn m2m cơ bản nó cung cấp không có giải pháp tôi có thể imediately xem.LINQ mối quan hệ nhiều-nhiều: Giải pháp?

Điều tồi tệ hơn là trong khi nó hoạt động cho bất kỳ mối quan hệ bảng nào khác, LINQ không cho tôi một liên kết trong cấu trúc lớp cho bảng m2m của tôi.

Vì vậy, tôi có thể làm những việc như

artwork.artists.where(...) 
//or 
artist.Artworks.add(artwork) 

nhưng tôi không thể làm

artwork.artowrks_subjects.tagSubjects.where(...) 
//or 
tagSubject.artworks_subjects.add(artwork) 

alt text http://img299.imageshack.us/img299/257/20090902122107.png

Có một mô hình phổ biến để giải quyết hạn chế này?

+0

Vì lý do nào đó, m2m nghe có vẻ bẩn thỉu với tôi ... hãy xem xét việc viết chính tả nó ra;) – TJB

Trả lời

3

Tìm thấy giải pháp cho bản thân. Đối với các mối quan hệ tự động để làm việc, cả hai bảng cần các khóa chính (oops). Thông báo artworks_subjects thiếu biểu tượng PK.

2

Điều này phần lớn phụ thuộc vào khung bạn đang sử dụng. Nó âm thanh giống như bạn đang sử dụng LINQ-to-SQL, là rất chữ về bảng đối tượng. Với Entity Framework, có sự hỗ trợ sẵn có cho nhiều người, đặc biệt đối với trường hợp tầm thường bạn đã liệt kê (một bảng liên kết không có thuộc tính bổ sung). EF nói chung sẽ phát hiện ra mẫu này và ẩn bảng liên kết khỏi mô hình khái niệm (tôi không thể nhớ, nhưng nó có thể cần một PK kéo dài trên hai cột FK).

Tất nhiên, điều này sẽ trở nên chua nếu bạn muốn thêm cột vào bảng liên kết; vì vậy trong một số cách tôi sẽ bị cám dỗ để lại nó "như là".

Liên quan đến where v.v. - ý của bạn là gì? Bạn có thể tham gia vào hiệp hội và bạn có thể sử dụng Any v.v. bạn có một ví dụ cụ thể về những gì bạn muốn làm không?

+0

chính xác là những gì tôi đã thể hiện. Mục tiêu là thêm một thẻ vào đối tượng tác phẩm nghệ thuật. Việc tham gia hợp lý duy nhất là Nhiều đến Nhiều. Cách duy nhất tôi đã nhìn thấy rất rắm để làm điều đó với LINQ-to-SQL là chạy một vòng lặp, tạo ra các đối tượng artwork_subject, và ràng buộc chúng bằng tay. Những gì tôi thấy kỳ lạ, là tôi thậm chí không thể làm một đến nhiều tham gia giữa các tác phẩm nghệ thuật và bảng artwork_subjects (cùng áp dụng cho tagSubjects và artwork_subjects). –

-1

Có.Thay vì nhiều-nhiều sử dụng hai many-to-một trong những mối quan hệ:

Subject -*----1- ArtworkSubjectParticipation -1----*- Artwork 
+2

Đó không phải là những gì OP đã có trong ảnh chụp màn hình? –

+1

bạn có nghĩa là hai một-nhiều, phải không? – Kobi

+0

đó là nghịch đảo của những gì tôi có. nhưng kết quả thực sự có nghĩa là chỉ một thẻ có thể được liên kết với một tác phẩm nghệ thuật, đó không phải là mục tiêu. –

5

cách tôi đã nhận M2M làm việc trong LINQ2SQL:

  1. kéo các bảng vào xây dựng, như bạn' tái hiện trong câu hỏi
  2. loại bỏ các mối quan hệ giữa artworks_subjectartwor k
  3. tạo r mới elationship TỪ artworks_subject ĐẾN tác phẩm nghệ thuật
  4. nhấp chuột vào mối quan hệ mới để có được thuộc tính của nó
  5. thay đổi các cardinality từ OneToMany để OneToOne (vì ManyToOne không tồn tại)
  6. mở Child Thuộc tính phần và thay đổi trường Tên thành làm cho số ít (Ảnh minh họa Tác phẩm nghệ thuật)

nay là tagSubject thực thể sẽ có một bộ sưu tập của artwork_subjects, và artwork_subject sẽ có một loại tài sản của tác phẩm nghệ thuật gọi Ảnh minh họa. để bây giờ bạn có thể tạo một biểu thức LINQ như

var x = dbcontext.tagSubjects.Single(s=>s.name=="Landscape"). 
    Artwork_Subjects. 
    Select(as=>as.Artwork.Name); 
Các vấn đề liên quan