Dapper抛出“DynamicMethod的无效类型所有者”。

所以我正在尝试使用Dapper.net,我很喜欢它。 我不喜欢的是当我尝试批量插入实体时,我得到以下错误抛出:

DynamicMethod的类型所有者无效。

在System.Reflection.Eynamic.DynamicMethod.Init(String name,MethodAttributes属性,CallingConventions callingConvention,Type returnType,Type [] signature,Type owner,Module m,Boolean skipVisibility,Boolean transparentMethod,StackCrawlMark&stackMark)at System.Reflection.Emit。 DynamicMethod..ctor(String name,Type returnType,Type [] parameterTypes,Type owner,Boolean skipVisibility 1 literals) in D:\Dev\dapper-dot-net\Dapper NET40\SqlMapper.cs:line 3033 at Dapper.SqlMapper.GetCacheInfo(Identity identity, Object exampleParameters, Boolean addToCache) in D:\Dev\dapper-dot-net\Dapper NET40\SqlMapper.cs:line 2138 at Dapper.SqlMapper.d__61 Dapper.SqlMapper.CreateParamInfoGenerator(Identity identity,Boolean checkForDuplicates,Boolean removeUnused,IList 1 literals) in D:\Dev\dapper-dot-net\Dapper NET40\SqlMapper.cs:line 3033 at Dapper.SqlMapper.GetCacheInfo(Identity identity, Object exampleParameters, Boolean addToCache) in D:\Dev\dapper-dot-net\Dapper NET40\SqlMapper.cs:line 2138 at Dapper.SqlMapper.d__61 1.MoveNext()在D:\ Dev \ dapper-dot-net \ Dapper NET40 \ SqlMapper.cs:第1578 1..ctor(IEnumerable System.Collections.Generic.List 1..ctor(IEnumerable 1)采集)
at System.Linq.Enumerable.ToList [TSource](IEnumerable 1 source) at Dapper.SqlMapper.Query[T](IDbConnection cnn, String sql, Object param, IDbTransaction transaction, Boolean buffered, Nullable 1 commandTimeout,Nullable 1 commandType) in D:\Dev\dapper-dot-net\Dapper NET40\SqlMapper.cs:line 1479 at Dapper.SqlMapper.Query(IDbConnection cnn, String sql, Object param, IDbTransaction transaction, Boolean buffered, Nullable 1 commandTimeout,Nullable 1 commandType) in D:\Dev\dapper-dot-net\Dapper NET40\SqlMapper.cs:line 1418 at NinjaEvaluation.Data.Database.DapperWrapper.c__DisplayClass4 1.b__3(SqlConnection sqlConnection,SqlTransaction事务)在c:\ Projects \ InHouse中\ ninjaevaluation \ NinjaEvaluation \ NinjaEvaluation.Data \ Database \ DapperWrapper.cs:第52行,位于C:\ Projects \ InHouse \ ninjaevaluation \ NinjaEvaluation \ NinjaEvaluation.Data \ Database中的NinjaEvaluation.Data.Database.DapperWrapper.Invoke(Action`2动作) \ DapperWrapper.cs:第68行

当我运行我的查询时,这种情况发生在完全正常的情况:

  string sql = @" INSERT INTO XXX (XXXId, AnotherId, ThirdId, Value, Comment) VALUES (@XXXId, @AnotherId, @ThirdId, @Value, @Comment)"; var parameters = command .MyModels .Select(model => new { XXXId= model.XXXId, AnotherId= model.AnotherId, ThirdId= model.ThirdId, Value = model.Value, Comment = model.Comment }) .ToArray(); 

 sqlConnection.Query(sql, parameters, commandType: commandType, transaction: transaction) 

我发现以下SO线程由有同样问题的人启动但是问题似乎是.NET版本(3.5)但是我运行的是.NET 4.5,我无法弄清楚问题是什么。

有什么建议?

它失败,因为使用Query[]这种情况不期望参数的数组/序列。 Execute调用路径确实需要这个,并自动展开数据,每个项目执行一次SQL – 但这不是Query[] ,因此它尝试创建绑定到数组的动态方法(在您的情况下),这是不允许的。 代码可能应该更早地检测到这一点,并且只是说“不,这是不允许的”。

可能希望将.ToArray()更改为.ToArray() .Single()

在下一次构建之后,这将更加清晰; 以下传递:

  public void SO30435185_InvalidTypeOwner() { try { // not shown for brevity: something very similar to your code Assert.Fail(); } catch(InvalidOperationException ex) { ex.Message.IsEqualTo("An enumerable sequence of parameters (arrays, lists, etc) is not allowed in this context"); } } 

Query强烈地输入到集合时,我遇到了这个错误,如下所示: Query>

它应该只是Query

我在使用接口而不是类时遇到了这个错误:

Query工作,而Query没有