pask23
pask23

Reputation: 734

Dapper Multimapping with more than 7 types mapped, System.ArgumentException

I use dapper and i have a mapping with more than 7 types.

I know that in dapper exists a method 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)

and there is a reply here with very good example, but I can't resolve in my case.

Suppose to have this table

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)

a Poco like:

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; }    
}

and suppose that have this sql query

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

Now, based on reply attached, i call the method with this parameters

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();

but i continue to receive same error, about multimapping:

'System.ArgumentException' in Dapper.dll

Additional information: When using the multi-mapping APIs ensure you set the splitOn param if you have keys other than Id

do you think that there is a error in spliton parameters??I don't understand!

Upvotes: 6

Views: 4531

Answers (1)

Tim Sanders
Tim Sanders

Reputation: 26

Instead of:

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

Try this :

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

"State_Id" is the foreign key in Poi. Try splitting on "Id" instead. Also, make sure the primary key is first in the select. Dapper puts the first set of columns in the first object, the second set (starting with first split) in second object, and so on.

Dapper defaults to splitting on "Id" so after these changes you can use the default value of splitOn.

Upvotes: 1

Related Questions