모델에서 자식 컬렉션 및 / 또는 외래 키를 노출하지 않고 일대 다

c# dapper orm

문제

POCO 모델에 외래 키와 하위 컬렉션을 노출시키지 않으면 Dapper에 문제가 있습니다. 두 엔티티를 사용하여 간단한 예를 들어 봅시다.

Bike (Id, ModelName)
Tire (Id, Tread)

데이터베이스에는 각 타이어마다 Bike에 외래 키가 있습니다. 하지만 제 모델은 그렇지 않습니다. 데이터베이스에서이 구조체를 Dictionary<Bike, IEnumerable<Tire>> 로 구체화하려고합니다. 각 자전거 (고유)는 두 개의 타이어가있는 곳입니다.

다음 쿼리를 사용하여이 일대 다 관계를 선택할 수 있습니다.

SELECT b.Id, b.ModelName, t.Id, t.Tread
FROM Bike b
JOIN Tire t ON b.Id = t.bike_id

Dapper를 사용하여 매핑하기 위해 다음을 수행했습니다.

var dbResult = connection.Query<Bike, Tire, KeyValuePair<Bike, Tire>>("sql-query-above",
(a, s) => new KeyValuePair<Bike, Tire>(a, s);
splitOn: "Id");

LINQ를 사용하여 그 결과를 내 사전으로 바꾸려면 다음을 수행하십시오.

Dictionary<Bike, IEnumerable<Tire>> dict = dbResult.GroupBy(g => g.Key, g => g.Value).ToDictionary(g => g.Key, g => g.AsEnumerable());

그리고 올바르게 데이터 구조를 반환합니다.

Bike #1
 - Tire #1
 - Tire #2
Bike #2
 - Tire #3
 - Tire #4

그러나 이것이이 데이터 구조를 구현하는 가장 효율적인 방법입니까? 다른 방법으로는 사전을 피하고 외래 키와 관계를 노출하는 다른 엔티티 (예 : Tire의 Bike 및 FK의 Tires 컬렉션)를 작성하고 여기에 설명 된 것과 같은 매핑 방법을 사용할 수 있습니다 . 그러나 나는 그것이 여분의 많은 수업을 초래할 것이기 때문에 나의 모델에서 그것을 피하고 싶다. 그러나 성능은 어떻습니까? 이게 더 나쁘지 않습니까?

인기 답변

나는 Dapper를 사용하는 데 전문가가 아니지만, 경험하고있는 것과 같은 한계를 가지고 있습니다. 내 물건의 물건 중 하나가 당신 같은 타이어와 비슷한 상황이었습니다. 확장 메서드를 사용하여 내부 유형의 컬렉션을 채우는 두 번째 쿼리를 만드는 것이 더 간단하다는 것을 알았습니다.

그래서 모든 자전거를 먼저 잡은 다음 확장 메소드를 호출하여 다음과 같이 타이어 데이터를 가져올 수 있습니다.

dict.WithTires();    

나는 데이터베이스에 대한 두 번째 호출을 알고 있지만 매번 타이어 정보를 얻지 않아도 자전거를 잡을 수 있다는 단점이 있습니다.

또한 자전거 컬렉션에 타이어 컬렉션을 추가하는 것에 대해 생각해보십시오. IMHO는 사전보다 더 좋습니다. 당신이 이런 것을 가진다면 :

public class Bike
{
    public int id { get; set; }
    public string modelName { get; set; }
    public IList<Tires> tires { get; set; }
}

public class Tires
{
    public int id { get; set; }
    public string tread { get; set; }
}

개별 자전거 또는 자전거 컬렉션에 대한 타이어 데이터를 가져 오기위한 확장 방법을 쉽게 만들 수 있습니다.

Bike myBike = new Bike();
List<Bike> bikeCollection = new List<Bike>();

myBike.WithTires();
bikeCollection.WithTires();


아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow