매핑 된 7 개 이상의 유형이있는 Dapper Multimapping, System.ArgumentException

c# dapper

문제

나는 dapper를 사용하며 7 가지 이상의 타입을 가진 매핑을 가지고있다.

나는 IEnumerable<TReturn> Query<TReturn>(this IDbConnection cnn, string sql, Type[] types, Func<object[], TReturn> map, [Dynamic] dynamic param = null, IDbTransaction transaction = null, bool buffered = true, string splitOn = "Id", int? commandTimeout = null, CommandType? commandType = null) 에서 메소드 IEnumerable<TReturn> Query<TReturn>(this IDbConnection cnn, string sql, Type[] types, Func<object[], TReturn> map, [Dynamic] dynamic param = null, IDbTransaction transaction = null, bool buffered = true, string splitOn = "Id", int? commandTimeout = null, CommandType? commandType = null)

여기 에 아주 좋은 예를 들어 답장이 있지만, 제 경우에는 해결할 수 없습니다.

이 테이블을 가지고 있다고 가정하십시오.

Table Poi(
    Id,
    Date,
    LineId FK Line table,
    TrackId FK Track table,
    State_Id FK State table,
    Type_Id FK Type table,
    Category_Id FK Category table,
    Processing_Id FK Processing table,
    Vehicle_Id FK Vehicle table,
    SystemId FK System table,
    UnitId FK Unit table,
    Speed)

Poco는 다음과 같습니다.

class Poi
{
        public long Id { get; set; }
        public DateTime Date { get; set; }
        public float Speed { get; set; }        
        public  State State { get; set; }
        public  Type PoiType { get; set; }
        public  Category Category { get; set; }
        public  Processing Processing { get; set; }
        public  Vehicles Vehicle { get; set; }
        public  Line Line { get; set; }
        public  Track Track { get; set; }
        public  System System { get; set; }
        public  Unit Unit { get; set; }    
}

이 SQL 쿼리가 있다고 가정합니다.

select select poi.*, ps.Id, ps.Name, pt.name,pt.id,pc.id,pc.name,pc.issystem,processing.id,processing.name,processing.date, v.name,v.id,
                        t.id,t.name,t.code, ds.name, ds.id, du.id, du.name from Poi poi
left join State ps on poi.State_Id = ps.Id
left join Type pt on poi.PoiType_Id = pt.Id
left join Category pc on poi.Category_Id = pc.Id
left join Processing processing on poi.Processing_Id = processing.Id
left join Vehicles v on poi.Vehicle_Id = v.Id
left join Line l on poi.LineId = l.Id
left join Track t on poi.TrackId = t.Id
left join DiagSystem ds on poi.SystemId = ds.Id
left join DiagUnit du on poi.UnitId = du.Id

이제 첨부 된 응답을 기반으로이 매개 변수를 사용하여 메서드를 호출합니다.

connection.Query<Poi>(sql,
   new[]
   {
      typeof(Poi),
      typeof(State),
      typeof(Type),
      typeof(Category),
      typeof(Processing),
      typeof(Vehicles),
      typeof(Line),
      typeof(Track),
      typeof(System),
      typeof(Unit)
   },
   objects =>
   {
       Poi poi = objects[0] as Poi;
       State ps = objects[1] as State;
       Type pt = objects[2] as Type;
       Category pc = objects[3] as Category;
       Processing processing = objects[4] as Processing;
       Vehicles v = objects[5] as Vehicles;
       Line l = objects[6] as Line;
       Track t = objects[7] as Track;
       System ds = objects[8] as System;
       Unit du = objects[9] as Unit;

       poi.State = ps;
       poi.Type = pt;
       poi.Category = pc;
       poi.Processing = processing;
       poi.Vehicle = v;
       poi.Line = l;
       poi.Track = t;
       poi.System = ds;
       poi.Unit = du;  

     return poi;
   },
   new { Value = value }
   ,splitOn: "State_Id,PoiType_Id,Category_Id,Processing_Id,Vehicle_Id,LineId,TrackId,SystemId,UnitId"
).ToList();

그러나 나는 같은 오류를 계속 받았다.

Dapper.dll의 'System.ArgumentException'

추가 정보 : 다중 매핑 API를 사용할 때 ID가 아닌 키가있는 경우 splitOn 매개 변수를 설정하십시오.

스플라인 매개 변수에 오류가 있다고 생각합니까? 이해가 안됩니다!

수락 된 답변

대신에:

 select poi.*, ps.Id, ps.Name, pt.name,pt.id
 splitOn: "State_Id,PoiType_Id"

이 시도 :

 select poi.*, ps.Id, ps.Name, pt.id, pt.name
 splitOn: "Id,Id"

"State_Id"는 Poi의 외래 키입니다. 대신에 "Id"로 분할 해보십시오. 또한 기본 키가 선택 항목의 첫 번째 키인지 확인하십시오. Dapper는 첫 번째 객체에 첫 번째 열 집합을 넣고 두 번째 객체에는 두 번째 집합 (첫 번째 분할로 시작)을 놓는 식으로 계속 수행합니다.

Dapper는 기본적으로 "Id"에서 분리되도록되어 있으므로 이러한 변경 후에 splitOn의 기본값을 사용할 수 있습니다.



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