Dapper를 사용하여 관련 엔터티에 대한 CRUD

.net c# dapper orm

문제

내 응용 프로그램은 아래와 같이 엔티티 모델이되어 Dapper를 사용합니다.

public class Goal
{
    public string Text { get; set; }
    public List<SubGoal> SubGoals { get; set; }
}

public class SubGoal
{
    public string Text { get; set; }
    public List<Practise> Practices { get; set; }
    public List<Measure> Measures { get; set; }
}

아래의 저장소가 있습니다.

public interface IGoalPlannerRepository
{
    IEnumerable<Goal> FindAll();
    Goal Get(int id);
    void Save(Goal goal);
}

나는 아래 두 시나리오를 보았습니다.

  1. 데이터 (목표 엔티티)를 검색하는 동안 계층 구조의 모든 관련 오브젝트 (모든 하위 목표와 프랙티스 및 조치)를 검색해야합니다.
  2. 목표가 저장되면 모든 관련 데이터를 삽입 및 / 또는 업데이트해야합니다.

컬렉션을 "루핑"하고 많은 SQL 쿼리를 작성하는 것 이외의 다른 시나리오를 처리하는 더 좋은 방법이 있는지 제안하십시오.

수락 된 답변

Dapper를 사용하여 SQL에서 대량 일괄 처리 데이터 업데이트를 수행하는 가장 좋은 방법은 복합 쿼리를 사용하는 것입니다.

하나의 쿼리에있는 모든 개체를 다음과 같이 여러 결과 집합으로 검색 할 수 있습니다.

CREATE PROCEDURE get_GoalAndAllChildObjects
    @goal_id int
AS
SELECT * FROM goal WHERE goal_id = @goal_id
SELECT * FROM subgoals WHERE goal_id = @goal_id

그런 다음 아래와 같이 객체를 검색하는 dapper 함수를 작성합니다.

using (var multi = connection.QueryMultiple("get_GoalAndAllChildObjects", new {goal_id=m_goal_id})) {
    var goal = multi.Read<Goal>();
    var subgoals = multi.Read<SubGoal>();
}

다음은 대규모 데이터를 일괄 적으로 업데이트합니다. 테이블 매개 변수 삽입을 통해 그렇게 할 수 있습니다 (이 기사는 http://www.altdevblogaday.com/2012/05/16/sql-server-high-performance-inserts/에서 작성했습니다 ). 기본적으로 삽입하려는 각 데이터 유형에 대해 하나의 테이블을 만든 다음 해당 테이블을 매개 변수로 사용하여 데이터베이스에 기록하는 프로 시저를 작성합니다.

이는 초 고성능이며 대략 얻을 수있는만큼 최적화되어 있으며 코드도 복잡하지 않습니다.

그러나, 나는 "하위 목표"와 모든 다른 객체를 관계형으로 유지하는 것이 요점인가? 하나의 쉬운 대안은 목표와 모든 자식 객체가 텍스트로 직렬화 된 XML 또는 JSON 문서를 작성한 다음 해당 객체를 파일 시스템에 저장하는 것입니다. 믿을 수 없을만큼 높은 성능, 매우 간단하고 확장 성이 뛰어나며 코드가 거의 필요 없습니다. 유일한 단점은 SQL 문을 작성하여 약간의 작업만으로 모든 하위 목표를 검색 할 수 없다는 것입니다. 생각해볼만한 가치가 있을지도 모릅니다.)



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