2016-06-23 31 views
6

Próbuję odwzorować związek N-N z eleganckim użyciu jako DB MySQL. Jest to mniej więcej kod.Dapper wielu map wiele do wielu relacji

 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"); 
     } 

Kwerenda działa dobrze w kliencie SQL ale kiedy uruchomić powyższy kod otrzymuję ten wyjątek: „. W przypadku korzystania z API multi-mapping zapewnić ustawienie param splitOn jeśli masz klucze inne niż Id Parametr nazwa: splitOn "

Czy jest możliwe nawet odwzorowanie relacji NN mającej stół pośredni (OwnerPets)? ... Jeśli tak ... co robię źle?

Odpowiedz

5

Nie jestem pewien, czy uda się firmie Dapper zwrócić dane bezpośrednio, jak chcesz, ale można załadować dane w taki sposób, że istnieje relacja jeden do jednego między Właścicielami a zwierzętami, a następnie postępować zgodnie z zapytaniem LINQ grupować Zwierzęta dla każdego właściciela.

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; 
    });