简体   繁体   English

Dapper Multimapping映射了超过7种类型的System.ArgumentException

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

I use dapper and i have a mapping with more than 7 types. 我使用dapper,我有超过7种类型的映射。

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) 我知道在dapper中存在方法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: 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; }    
}

and suppose that have this sql query 并假设有这个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

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 Dapper.dll中的'System.ArgumentException'

Additional information: When using the multi-mapping APIs ensure you set the splitOn param if you have keys other than Id 附加信息:使用多重映射API时,如果您具有ID以外的其他键,请确保设置splitOn参数

do you think that there is a error in spliton parameters??I don't understand! 你认为spliton参数有错误吗?我不明白!

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. “ State_Id”是Poi中的外键。 Try splitting on "Id" instead. 尝试拆分“ Id”。 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将第一组列放在第一个对象中,将第二组(从第一个拆分开始)放在第二个对象中,依此类推。

Dapper defaults to splitting on "Id" so after these changes you can use the default value of splitOn. Dapper默认将“ Id”拆分,因此在进行这些更改后,您可以使用splitOn的默认值。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM