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


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

DynamicMethod的类型所有者无效。

在System.Reflection.Emit.DynamicMethod.Init(String name,   MethodAttributes属性,CallingConventions callingConvention,   键入returnType,类型[]签名,类型所有者,模块m,布尔值   skipVisibility,Boolean transparentMethod,StackCrawlMark&stackMark)   在System.Reflection.Emit.DynamicMethod..ctor(String name,Type   returnType,Type [] parameterTypes,Type owner,Boolean skipVisibility)   在Dapper.SqlMapper.CreateParamInfoGenerator(身份标识,   Boolean checkForDuplicates,Boolean removeUnused,IList1 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.<QueryImpl>d__611.MoveNext()in   D:\ Dev \ dapper-dot-net \ Dapper NET40 \ SqlMapper.cs:1578行at   System.Collections.Generic.List1..ctor(IEnumerable1个收藏)
  在System.Linq.Enumerable.ToList [TSource](IEnumerable1 source) at Dapper.SqlMapper.Query[T](IDbConnection cnn, String sql, Object param, IDbTransaction transaction, Boolean buffered, Nullable1   commandTimeout,Nullable1 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, Nullable1   commandTimeout,Nullable1 commandType) in D:\Dev\dapper-dot-net\Dapper NET40\SqlMapper.cs:line 1418 at NinjaEvaluation.Data.Database.DapperWrapper.<>c__DisplayClass41.b__3(的SqlConnection   sqlConnection,SqlTransaction事务)中   C:\项目\点播服务\ ninjaevaluation \ NinjaEvaluation \ NinjaEvaluation.Data \数据库\ DapperWrapper.cs:线   52在NinjaEvaluation.Data.Database.DapperWrapper.Invoke(Action`2   行动)   C:\项目\点播服务\ ninjaevaluation \ NinjaEvaluation \ NinjaEvaluation.Data \数据库\ 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,我无法弄清楚问题是什么。

有什么建议么?


12738
2018-05-25 09:32


起源

我想知道 - 这是一个受限制的信任环境吗?或者常规.net没什么特别的? - Marc Gravell♦
定期的当地环境。没有任何限制。 - Maffelu


答案:


它失败,因为这种情况使用 Query[<T>] 不期望参数的数组/序列。该 Execute 呼叫路径  期待这一点,并自动展开数据,每个项目执行一次SQL - 但事实并非如此 Query[<T>],所以它试图创建绑定到的动态方法 排列 (在你的情况下),这是不允许的。代码可能应该更早地检测到这一点,并且只是说“不,这是不允许的”。

大概 想要改变你的 .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");
        }
    }

9
2018-05-26 07:54



我应该用Execute :) - Maffelu
@Maffelu嘿,或者说; p - Marc Gravell♦
这是Dapper的缺点,还是逻辑上用一系列参数查询是没有意义的? 这个问题 有兴趣选择插入行的ID,这在Dapper的当前状态下是不可能的。 这个问题 意味着它 以前 工作 - 第一个片段 - 或者是与此相关的错误?对我来说,似乎如果 Execute 可以处理一系列参数, Query 也应该能够。我能提出的最佳解决方法涉及4个单独的查询,这并不理想 - Rob♦
@Rob很好,循环出现的地方不会对实际操作产生巨大影响;是的,我们可以做到 Query 使用序列并基本上连接结果,但它会更清楚吗? - Marc Gravell♦


我遇到这个错误 Query 强烈输入集合,如下所示: Query<IEnumerable<string>>

什么时候应该 Query<string>


4
2017-09-28 16:49





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

Query<MyObject> 工作,而 Query<IMyObject> 没有


2
2018-05-31 15:09