Bạn có một kiểu dữ liệu mà bạn đang gọi các tên riêng biệt. Đó là một chút khó hiểu. Tuy nhiên, để điều này hoạt động với mã, trước tiên bạn chỉ cần cấu hình thông thạo sau trong lớp Custom DbContext của bạn:
ghi đèprotected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<user>().
HasMany(c => c.Buddies).
WithMany().
Map(
m =>
{
m.MapLeftKey("user_id");
m.MapRightKey("buddy_id");
m.ToTable("buddies");
});
}
Điều này giả sử lớp người dùng của bạn trông giống như sau:
[Table("user")]
public class user
{
public int id { get; set; }
public string name { get; set; }
public string email { get; set; }
public virtual List<user> Buddies { get; set; }
}
Nếu bạn sử dụng phương pháp trên, mọi đối tượng người dùng của bạn sẽ có một thuộc tính điều hướng trên đó có tên là Bạn thân. Khi truy vấn người dùng, bạn sẽ muốn tải người dùng thân thiết , thực hiện:
context.users.Include("Buddies")
Hơn nữa, Để giải quyết vấn đề của bạn với nhiều người đọc. Đó là vì bạn chưa liệt kê truy vấn (db.users) từ vòng lặp đầu tiên của bạn. Để giải quyết vấn đề đó, bạn có thể liệt kê truy vấn như sau:
var users = context.users.Include("Buddies").ToList();
foreach(var user in users)....
Và nếu bạn sử dụng cấu hình ở trên, bạn không cần phải thử và đối sánh id, bạn chỉ cần lấy danh sách (trường rỗng nếu mới) từ người dùng bằng cách sử dụng thuộc tính điều hướng bạn bè (ảo, tải chậm), thực hiện:
user.Buddies
Như bạn có thể thấy, bạn không thực sự cần một 'Model.buddy' (vì nó chỉ chứa một ánh xạ id) Khung thực thể sẽ chăm sóc liên kết. Tuy nhiên, nếu không phải lúc nào bạn cũng đưa Bạn thân vào truy vấn người dùng của mình, bạn có thể muốn có bảng. Điều này sẽ được truy vấn với LINQ theo cách sau:
var userBuddies = db.buddies.Where(buddy=>buddy.user_id == user.id).ToList();
//An enumerated list of user buddies
//do stuff