본격적인 OR / M을 대체하기 위해 dapper 사용

c# dapper orm

문제

Dapper 마이크로 OR / M이 정말 인상 깊었습니다. 저는 그것을 정말로 완전한 OR / M의 동반자로 사용하고 싶습니다. 어쨌든 db에서 계층 구조를 deserialize하는 전략이 있다면 어쨌든 알아 내지 못했습니다. 예를 들어 레코드 세트 행에 대해 반환 된 객체는 필드에 의존합니다 (예 : NH의 'discriminator'). 또한 계층 구조는 조인을 통해 더 많은 테이블을 분할 할 수 있으므로 행을 나타내는 유형은 다른 테이블의 레코드 존재 여부에 따라 달라집니다. 위의 두 가지 전략을 혼합하여 표현 된 계층 구조를 갖는 것은 예를 들어 뉴 햄프셔가 지원하지 않지만 '관계형 생활'에 존재하는 것입니다. 그래서 질문 :

  • Dapper가 그런 시나리오를 처리합니까?
  • 이 시나리오는 실적면에서 Dapper의 노력을 저해합니까?

또 다른 주제는 캐싱입니다. 쿼리를위한 Dapper 캐시는 공격적이며, "컨텍스트와 같은 세션"을 가지고 각 세션에 대해 쿼리 캐시를 갖는 것이 더 좋지 않거나, 이것이 다시 Dapper의 주요 동기에 불쾌감을 줄 수 있습니까?

수락 된 답변

Dapper가 맞춤형 구성 논리를 지원하지 않는 순간에, 내가 원하는 것은 다음과 같을 것입니다.

class Post {}
class Question : Post { .. }
class Answer : Post { ... }

Func<IDbDataReader, Func<IDbDataReader, Post>> factoryLocator
        = ... my magic factory locater; 

cnn.Query<Post>(@"
select * from Posts p 
left join Questions q on q.Id = p.Id 
left join Answers a on a.Id = p.Id", factoryLocator: factoryLocator);

우리는 실제와 같은 문제를 결코 해결할 수 없었기 때문에 이러한 논리를 구현하지 않기로 결정했습니다. 또한 상당한 양의 내부 복잡성과 상당한 양의 외부 복잡성을 도입합니다 ( post is Question 을 전환해야 할 때 post is Question 임).

나는 당신이 포함을위한 좋은 논의를 할 수 있고 패치가 간단하다면 이런 종류의 특징을 포함하는 것을 절대적으로 반대하지 않는다. 나는 또한 Dapper에서 이러한 종류의 기능을 주입 할 수 있도록 후크를 추가했습니다.

캐싱 전략에 관해서 우리는 일반적으로 캐시를 결코 팽창시키지 않는다는 것을 알았습니다. bloating은 매개 변수가없는 SQL을 생성하여 말장난을 잘못 사용하는 경우에만 발생합니다. 필자는 현재 사용되는 ConcurrentDictionary 대신 자신의 캐시 공급자를 지정할 수있는 후크 추가를 전적으로 지원합니다.



아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.
아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.