2012-03-21 42 views
11

Tôi đang sử dụng khung pháp nhân và mô hình hóa mối quan hệ nhiều-nhiều.Có thể trực tiếp tham khảo bảng nhiều người dùng khung thực thể, mã đầu tiên

Tôi đã tạo ra mối quan hệ giữa hai thực thể sử dụng API thông thạo (giả sử người dùng và nhóm):

this.HasMany(t => t.Users) 
.WithMany(t => t.Groups) 
.Map(
m => 
{ 
    m.ToTable("GroupMembers"); 
    m.MapLeftKey("Group_Id"); 
    m.MapRightKey("User_Id"); 
}); 

này hoạt động tuyệt vời, nhưng tôi muốn cũng có thể tham khảo bảng GroupMembers trực tiếp. Để làm điều đó, tôi có một cái gì đó như:

[Table("GroupMembers")] 
public class GroupMember 
{ 
    #region Properties 

    /// <summary> 
    /// Gets or sets the group. 
    /// </summary> 
    public virtual Group Group { get; set; } 

    /// <summary> 
    /// Gets or sets the Id of rht group. 
    /// </summary> 
    [Key] 
    [Column("Group_Id", Order = 1)] 
    public int GroupId { get; set; } 

    /// <summary> 
    /// Gets or sets the user. 
    /// </summary> 
    public virtual User User { get; set; } 

    /// <summary> 
    /// Gets or sets the Id of the user. 
    /// </summary> 
    [Key] 
    [Column("User_Id", Order = 2)] 
    public int UserId { get; set; } 

    #endregion 
}  

Tuy nhiên, tôi sẽ nhận được lỗi sau khi khởi tạo của DbContext:

Schema định là không hợp lệ. Lỗi: (381,6): lỗi 0019: EntitySet 'GroupUser' với lược đồ 'dbo' và bảng 'GroupMembers' là đã được xác định. Mỗi EntitySet phải tham chiếu đến một lược đồ duy nhất và bảng .

Tôi tin rằng điều này là do khung thực thể không nhận ra rằng bảng GroupMembers được chỉ định trong API thông thạo và bảng thực thể GroupMembers thực sự là một trong cùng một. Nói cách khác, nếu tôi loại bỏ mã API thông thạo mô tả mối quan hệ nhiều-nhiều, thì tôi thành công có thể khởi tạo DbContext.

Tôi có thể có bảng nhiều đến mức mà tôi cũng có thể tham khảo trực tiếp không?

Trả lời

11

Không, bạn không thể. Nếu bạn muốn có quyền truy cập vào bảng tham gia thông qua một thực thể riêng biệt, bạn phải thay thế mối quan hệ nhiều-nhiều của mình theo hai mối quan hệ một-nhiều và thay đổi thuộc tính điều hướng trong UserGroup để tham chiếu GroupMember:

public class Group 
{ 
    public int GroupId { get; set; } 
    public virtual ICollection<GroupMember> Members { get; set; } 
} 

public class User 
{ 
    public int UserId { get; set; } 
    public virtual ICollection<GroupMember> Members { get; set; } 
} 

modelBuilder.Entity<Group>() 
    .HasMany(g => g.Members) 
    .WithRequired(gm => gm.Group); 

modelBuilder.Entity<User>() 
    .HasMany(u => u.Members) 
    .WithRequired(gm => gm.User); 

Tại sao bạn muốn thực thể GroupMember này? Nó không chứa bất kỳ ý nghĩa kinh doanh nào và chỉ có các tham chiếu và các khóa. Thông thường, bạn có thể nhận và sửa đổi bất kỳ nội dung nào của bảng kết nối bằng cách viết các truy vấn LINQ và bằng cách sử dụng các đối tượng/các thực thể điều hướng GroupUser DbSets /.

+1

Cảm ơn. Cả Người dùng và Nhóm được kế thừa từ bảng cơ sở, Hiệu trưởng và có một bảng khác, Quyền, chứa quyền cho cả người dùng và nhóm. Truy vấn LINQ cho rằng trông giống như: từ p trong ngữ cảnh.Quyền tham gia m trong ngữ cảnh.GroupMembers trên p.PrincipalId bằng m.GroupId nơi m.UserId.Equals (principalId) chọn p Tôi không hoàn toàn chắc chắn cách thực hiện truy vấn đó mà không trực tiếp tham chiếu bảng GroupMembers. – Eric

+0

@Eric: Tôi khuyên bạn nên tạo một câu hỏi riêng cho việc này với nhiều chi tiết hơn về mô hình. – Slauma

+0

@Eric Tôi có hoàn toàn cùng một vấn đề, có vẻ như vô lý mà api thông thạo có thể chỉ tạo ra các thực thể thay vì sử dụng những cái hiện có – Lu4

0

Có, bạn có thể! Kiểm tra this. Ngoài ra, loại bỏ GroupMembers thực thể và bộ sưu tập IDbSet.

+0

Điều này không trả lời câu hỏi, hoàn toàn ngược lại. Đây là về cách làm cho nó tự động * mà không có * truy cập vào bảng, Câu hỏi là về cách truy cập vào bảng. –

0

Chúng tôi đã giải quyết vấn đề này bằng cách tạo chế độ xem chỉ được sử dụng để xác định mối quan hệ. Chúng tôi có các trường khác trong bảng tra cứu mà chúng tôi cần truy cập.

Chế độ xem chỉ chọn các trường tham gia từ bảng tra cứu.

1

Có, bạn có thể ... Nếu bạn sử dụng một Ngữ cảnh khác. Nếu bạn cố gắng ánh xạ nhiều thực thể vào cùng một bảng trong cùng một bối cảnh thì bạn sẽ gặp lỗi. Nhưng nếu bạn đặt hai ánh xạ trong các bối cảnh riêng biệt thì sẽ không có vấn đề gì. Bằng cách này bạn có thể có một ánh xạ mô tả mối quan hệ nhiều-nhiều với bảng kết nối trong suốt như thể chỉ có các khóa lạ bên trong nó ... Và bạn có thể có một ánh xạ khác, với ngữ cảnh riêng của nó, để trưng ra bảng kết nối thực tế nếu bạn muốn nhận được bất kỳ thuộc tính nào của mối quan hệ.

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