2010-06-30 40 views
9

Làm thế nào để bạn thể hiện mối quan hệ nhiều-nhiều trong EF4 Code-First CTP3?Mối quan hệ nhiều-với-nhiều trong Code-First EF4

Ví dụ nếu tôi có các lớp sau:

class User 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
    public ICollection<Profile> Profiles { get; set; } 
} 

class Profile 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
} 

Trong cơ sở dữ liệu có một bảng UserProfiles rằng có FK cho người dùng và FK cho hồ sơ. Làm thế nào tôi có thể lập bản đồ này?

CHỈNH SỬA: Tôi hiểu cách lập bản đồ hiện tại với thuộc tính ICollection<User> trên Profile, nhưng tôi thực sự không muốn có thuộc tính điều hướng ngược lại khi cần là "Người dùng có nhiều tiểu sử".

Trả lời

8

EDIT: CTP4 được phát hành vào cuối ngày hôm qua (ngày 14 tháng 7 năm 2010) và hiện nay có hỗ trợ cho việc này:

modelBuilder.Entity<Post>().HasMany(p => p.Tags).WithMany();


tôi phát hiện ra cuối cùng rằng đây không phải là hiện khả thi. Microsoft đang tìm cách thêm tính năng này (chỉ có một thuộc tính điều hướng).

Xem liên kết này trên các diễn đàn MSDN để biết thêm thông tin: http://social.msdn.microsoft.com/Forums/en/adonetefx/thread/6920db2b-88c7-4bea-ac89-4809882cff8f

+3

Vui mừng khi họ thực hiện điều này. Tôi thấy mình phải thêm các thuộc tính điều hướng không mong muốn để giải quyết vấn đề này. Code-First đang đến cùng độc đáo! – djskinner

+0

@Daniel - Đồng ý. – TheCloudlessSky

5

Với nhiều đến nhiều mối quan hệ bạn nên bao gồm bất động sản chuyển hướng trên cả hai mặt và làm cho họ ảo (sử dụng tải lười biếng)

class User 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
    public virtual ICollection<Profile> Profiles { get; set; } 
} 

class Profile 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
    public virtual ICollection<User> Users { get; set; } 
} 

Sau đó, với thiết lập đó bạn có thể xác định mối quan hệ của bạn với nhiều người (bạn cũng có thể cho phép khung thực thể làm điều đó cho bạn nhưng tôi không thích quy ước đặt tên nó sử dụng.)

 modelBuilder.Entity<Profile>(). 
      HasMany(p => p.Users). 
      WithMany(g => g.Profiles). 
      Map(t => t.MapLeftKey("ProfileID") 
       .MapRightKey("UserID") 
       .ToTable("UserProfiles")); 

Điều này sẽ cung cấp cho bạn một bảng có tên là UserProfiles với UserID và ProfileID là Khóa.

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