2012-02-24 29 views
30

Tôi có một mô hình nhưEntity Framework 4.3 mã đầu tiên nhiều nhiều nhiều bằng cách sử dụng bảng tương tự

public class User 
{ 
    [Key] 
    public long UserId { get; set; } 

    [Required] 
    public String Nickname { get; set; } 

    public virtual ICollection<Town> Residencies { get; set; } 

    public virtual ICollection<Town> Mayorships { get; set; } 
} 

public class Town 
{ 
    [Key] 
    public long TownId { get; set; } 

    [Required] 
    public String Name { get; set; } 

    public virtual ICollection<User> Residents { get; set; } 
    public virtual ICollection<User> Mayors { get; set; } 
} 

Tôi đã hy vọng EF sẽ tạo ra hai nhiều đến mối quan hệ nhiều bằng cách sử dụng tự động tạo ra Bảng TownResidents và TownMayors. Tôi dường như không thể tìm thấy quy ước cần thiết hoặc chú thích rõ ràng để nhận kết quả này.

Thay vào đó, tôi nhận được hai ID người dùng FK trong bảng Town và hai FK TownIds trong bảng Người dùng.

Bất kỳ ý tưởng nào để EF có thể nhìn thấy chúng ở hai mối quan hệ với nhiều mối quan hệ?

Cảm ơn

Trả lời

30

Vâng, EF không có một số loại văn bản và thuật toán nhận dạng ngữ pháp mà sẽ được yêu cầu để xác định rằng bạn (có thể là) muốn điều đó User.ResidenciesTown.Residents dạng một cặp thuộc tính điều hướng và User.MayorshipsTown.Mayors tạo thành một cặp thứ hai. Do đó, giả sử rằng bạn có bốn mối quan hệ một-nhiều-một- một và nhiều và mỗi thuộc tính điều hướng thuộc về một trong các mối quan hệ. (Đây là lý do cho bốn phím nước ngoài bạn đã thấy trong các bảng cơ sở dữ liệu.)

giả định Tiêu chuẩn này không phải là những gì bạn muốn, vì vậy bạn phải xác định các mối quan hệ một cách rõ ràng để ghi đè ước tiêu chuẩn này:

Hoặc với các chú thích dữ liệu:

public class User 
{ 
    [Key] 
    public long UserId { get; set; } 

    [Required] 
    public String Nickname { get; set; } 

    [InverseProperty("Residents")] 
    public virtual ICollection<Town> Residencies { get; set; } 

    [InverseProperty("Mayors")] 
    public virtual ICollection<Town> Mayorships { get; set; } 
} 

Hoặc với API thạo:

modelBuilder.Entity<User>() 
    .HasMany(u => u.Residencies) 
    .WithMany(t => t.Residents) 
    .Map(x => 
    { 
     x.MapLeftKey("UserId"); 
     x.MapRightKey("TownId"); 
     x.ToTable("TownResidents"); 
    }); 

modelBuilder.Entity<User>() 
    .HasMany(u => u.Mayorships) 
    .WithMany(t => t.Mayors) 
    .Map(x => 
    { 
     x.MapLeftKey("UserId"); 
     x.MapRightKey("TownId"); 
     x.ToTable("TownMayors"); 
    }); 

thạo API có ưu điểm là bạn có thể kiểm soát nam e của bảng liên kết (và các tên cột chính). Bạn không thể xác định những tên đó bằng chú thích dữ liệu.

+0

Cảm ơn. Tôi đã thử cả hai phương pháp và cả hai đều làm việc nhưng như bạn đã nói phương pháp thông thạo cho phép bạn kiểm soát tên bảng vì vậy tôi thích phương pháp đó. Cảm ơn một lần nữa. – Sean

+0

Phần Bản đồ là không cần thiết. Mã api thông thạo của bạn thực hiện công việc mà không cần nó. – ozgur

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