2016-06-23 17 views
6

Tôi đang cố gắng ánh xạ một mối quan hệ N-N với người lập bản đồ bằng cách sử dụng DB MySQL. Đây là nhiều hay ít mã.Dapper đa ánh xạ nhiều mối quan hệ

 var query = new StringBuilder(); 
     query.Append("SELECT O.Id, O.Email, O.Status, P.Name FROM Owners AS O"); 
     query.Append(" INNER JOIN OwnerPets OP ON OP.OwnerId = O.Id"); 
     query.Append(" INNER JOIN Pets AS P ON P.Id = OP.PetId"); 
     query.Append(" WHERE O.Status = @Status;"); 

     using (var dbConnection = CreateConnection()) 
     { 
      return dbConnection.Query<Owner, IEnumerable<Pet>, Owner>(query.ToString(), (owner, pets) => 
      { 
       owner.Pets = pets.ToList(); 
       return Owner; 
      }, new { Status = status }, splitOn: "OwnerId, PetId"); 
     } 

Các truy vấn hoạt động tốt trong một khách hàng SQL nhưng khi tôi chạy đoạn mã trên tôi nhận được ngoại lệ này. "Khi sử dụng các API đa bản đồ đảm bảo bạn thiết lập các param splitOn nếu bạn có các phím khác hơn Id Parameter name: splitOn "

Thậm chí có thể lập bản đồ mối quan hệ NN có bảng trung gian (OwnerPets) không? ... Nếu vậy ... tôi đang làm gì sai?

Trả lời

5

Tôi không chắc liệu bạn có thể nhận Dapper trả lại dữ liệu trực tiếp như bạn muốn nhưng bạn có thể tải dữ liệu sao cho có mối quan hệ một-một giữa Chủ sở hữu và Thú cưng và sau đó theo dõi nó với truy vấn LINQ để nhóm các vật nuôi cho mỗi chủ sở hữu.

return dbConnection 
    .Query<Owner, Pet, Owner>(
     query, 
     (owner, pet) => 
     { 
      owner.Pets = owner.Pets ?? new List<Pet>(); 
      owner.Pets.Add(pet); 
      return owner; 
     }, 
     new { Status = status }, 
     splitOn: "Name" 
    ) 
    .GroupBy(o => o.Id) 
    .Select(group => 
    { 
     var combinedOwner = group.First(); 
     combinedOwner.Pets = group.Select(owner => owner.Pets.Single()).ToList(); 
     return combinedOwner; 
    }); 
Các vấn đề liên quan