semi-flexible 스키마 디자인을 가진 데이터베이스에서 사용하기위한 ORM

c# dapper orm petapoco sql

문제

Dapper, Massive, PetaPoco 등의 "마이크로"접근법을 좋아하며 데이터베이스에 보내는 SQL을 제어하고 싶습니다. 대부분은 상대적으로 간단합니다. 나는 또한 POCO의 작업을 좋아하지만 다소 유연한 스키마 디자인을 다루는 경우 종종 문제가 발생합니다 :)

Person 엔티티가 있고, 항상 다음과 같은 속성을 가지고 있다고 가정 해 봅시다.

  • 신분증
  • 이름
  • 이메일
  • 전화

그러나 어떤 경우에는 다음과 같은 추가 속성이있을 수 있습니다.

  • SpecialPhoneNumber
  • VeryCustomValue

나는 항상 거기에있을 공통의 특성을 가진 POCO를 원합니다. 그러나 다른 하나는 키 / 값 콜렉션에서 액세스 가능하게하십시오.

최선의 접근 방법은 무엇입니까? 그리고 언급 된 "mirco-orm 's"중 어떤 것도 이것을 지원합니까? 나는 그 (것)들을 전부 보았다. 그러나 그들이하는 어떤 지시도 발견하지 않고 있었다. 그러나 아마 나는 무엇인가 놓치고있다.

이 작업을 SqlDataReader를 사용하여 직접 수행 할 수 있습니까? 또는 리플렉션을 사용하여 객체를 만들 때 수백 개의 행을 읽는 성능이 좋지 않습니까? 언급 된 orm은 모두 꽤 잘하는 것처럼 보입니다. 그리고 나는 아래에 DataReader를 사용하는 것으로 추측합니다.

희망이 당신을 도울 수 :)

편집 : 아마 우리는 응용 프로그램 아키텍처에 대한 통제가 없다 언급해야합니다. 이것은 개별 고객이 자신의 응용 프로그램과 기본 데이터베이스를 사용자 정의 할 수있게 해주는 ERP 솔루션입니다. 응용 프로그램에 필드를 추가하면 데이터베이스의 열이 추가됩니다. 나쁘다! 처음부터 명확하게하지 않는 것

수락 된 답변

Massive 는 데이터를 ExpandoObject 의 것으로 구체화하기 때문에 이것을 지원할 수 있습니다.

비밀 소스는 ExpandoObject입니다. 들어가는 모든 것과 Massive에서 나오는 모든 것은 Expando â € "로 당신이 원하는대로 할 수 있습니다. 그것의 코어에서 ExpandoObject는 IDictionary <string, object>

ExpandoObject는 IDictionary<string, Object>IEnumerable<KeyValuePair<string, Object>> 를 구현하므로 필요한 방식으로 멤버를 열거하고 테스트 할 수 있습니다.

Massive의 기본값은 SELECT * 쿼리를 발행하는 것이므로 ExpandoObject는 알지 못하는 테이블이라도 테이블의 모든 필드를 포함합니다.

Github에서 Massive의 현재 코드를 얻을 수 있습니다.

Dapper 는 동적 객체를 선택할 수도 있지만 Massive와는 달리 데이터 만 선택하고 삽입, 업데이트 또는 삭제할 수 없습니다. 편집 : Dapper 문서를 검토하면 수정을 수행 할 수있는 것처럼 보입니다. SQL을 실행할 수 있기 때문입니다. Dapper로 인서트를 수행하는 것에 대한 최신 정보가 있습니다.


인기 답변

nHibernate의 동적 매핑을 살펴볼 수 있습니다.

http://ayende.com/blog/3942/nhibernate-mapping-dynamic-component

이러한 확장 속성을 일반 Directory<string,object> 로 가져올 수 있습니다. 따라서 이러한 일반 가방 (사전)을 사용하는 클래스가 있으며 동적으로 XML 매핑을 확장 할 수 있습니다.

nHibernate가 나머지 작업을 수행합니다.




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