2016-09-29 24 views
7

Tôi đang cố gắng ánh xạ mối quan hệ nhiều-nhiều với cùng một thực thể. Thực thể User có một trường IList<User> dữ liệu cho Contacts, mà lưu trữ danh bạ của người sử dụng/bạn bè thông tin:Cấu trúc thực thể Core: mối quan hệ nhiều-nhiều với cùng một thực thể

public class User : DomainModel 
{ 
    public virtual IList<User> Contacts { get; protected set; } 
    //irrelevant code omitted 
} 

Khi tôi cố gắng sử dụng API thông thạo để lập bản đồ này nhiều mối quan hệ, nó mang lại cho tôi một số rắc rối. Rõ ràng, khi tôi sử dụng HasMany() trên thuộc tính user.Contacts, nó không có phương thức WithMany() để gọi tiếp theo. Intellisense từ Visual Studio chỉ hiển thị WithOne(), nhưng không hiển thị WithMany().

modelBuilder.Entity<User>().HasMany(u => u.Contacts).WithMany() 
// gives compile time error: CS1061 'CollectionNavigationBuilder<User, User>' does not contain a definition for 'WithMany' and no extension method 'WithMany' accepting a first argument of type 

Vậy tại sao điều này lại xảy ra? Có điều gì tôi đã làm sai để lập bản đồ mối quan hệ nhiều-nhiều này không?

+0

Bạn có thể mất một cái nhìn lúc này: https://ef.readthedocs.io/en/latest/modeling/relationships.html#many-to-many –

Trả lời

15

Vậy tại sao điều này lại xảy ra? Có bất kỳ điều gì tôi đã làm sai để lập bản đồ mối quan hệ nhiều-nhiều này không?

Không, bạn không làm gì sai. It's just not supported. Tình trạng hiện tại here.

Mối quan hệ nhiều người không có lớp tổ chức đại diện cho bảng tham gia chưa được hỗ trợ. Tuy nhiên, bạn có thể đại diện cho một mối quan hệ nhiều-nhiều- bằng cách bao gồm một lớp thực thể để tham gia bảng và ánh xạ hai mối quan hệ một-nhiều riêng biệt.

Với EF-Core, bạn nên tạo thực thể cho bảng ánh xạ. Chẳng hạn như UserContacts. Một ví dụ hoàn chỉnh trong số docs, như được đề cập trong các nhận xét. Tôi chưa thực sự thử nghiệm mã bên dưới, nhưng nó sẽ trông giống như sau:

public class UserContacts 
{ 
    public int UserId { get; set; } 
    public virtual User User { get; set; } 

    public int ContactId { get; set; } // In lack of better name. 
    public virtual User Contact { get; set; } 
} 

public class User : DomainModel 
{ 
    public List<UserContacts> Contacts { get; set; } 
} 

modelBuilder của bạn.

modelBuilder.Entity<UserContacts>() 
     .HasOne(pt => pt.Contact) 
     .WithMany(p => p.Contacts) 
     .HasForeignKey(pt => pt.ContactId); 

    modelBuilder.Entity<UserContacts>() 
     .HasOne(pt => pt.User) 
     .WithMany(t => t.Contacts) 
     .HasForeignKey(pt => pt.UserId); 
+0

Trong modelBulder.Entity đầu tiên, nó phải là ".WithMany (p => p.Users)" thay vì ".WithMany (p => p.Contacts)"? –

+0

@ CarlosAdrián - Tôi nghĩ là không. Kể từ khi nó tham chiếu đến cùng một bảng. Nó vẫn là một người dùng có nhiều liên hệ. Người liên hệ vẫn là người dùng. – smoksnes

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