【问题标题】:Dapper throws "Invalid type owner for DynamicMethod."Dapper 抛出“DynamicMethod 的类型所有者无效”。
【发布时间】:2015-05-25 09:32:23
【问题描述】:

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

DynamicMethod 的类型所有者无效。

在 System.Reflection.Emit.DynamicMethod.Init(字符串名称, MethodAttributes 属性,CallingConventions 调用Convention, 类型 returnType、Type[] 签名、类型所有者、Module m、Boolean skipVisibility, Boolean transparentMethod, StackCrawlMark & stackMark) 在 System.Reflection.Emit.DynamicMethod..ctor(字符串名称,类型 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:line 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 命令超时,可空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, 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:\Projects\InHouse\ninjaevaluation\NinjaEvaluation\NinjaEvaluation.Data\Database\DapperWrapper.cs:line 52 在 NinjaEvaluation.Data.Database.DapperWrapper.Invoke(动作`2 行动)在 c:\Projects\InHouse\ninjaevaluation\NinjaEvaluation\NinjaEvaluation.Data\Database\DapperWrapper.cs:line 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)

我发现the following SO-thread 是由遇到同样问题的人发起的,但问题似乎是 .NET 版本 (3.5),但我正在运行 .NET 4.5,但我不知道问题出在哪里。

有什么建议吗?

【问题讨论】:

  • 我想知道 - 这是一个受限的信任环境吗?还是没有什么特别之处的普通 .net?
  • 常规本地环境。完全没有限制。

标签: c# dapper


【解决方案1】:

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

Query&lt;MyObject&gt; 有效,而 Query&lt;IMyObject&gt; 无效

【讨论】:

  • 这也是我遇到的问题。
  • 和我一样,我在使用接口而不是类时遇到了这个错误:Query 有效,而 Query 没有。您应该确保在执行命令的返回值上使用类类型,而不是接口。
  • 使用接口是罪魁祸首,请使用具体类。如果接口通过,Dapper 将无法工作。
  • 切换回课堂也解决了我的问题。
  • 这里也一样。导致我出现问题的是界面的使用。
【解决方案2】:

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

您可能想将您的 .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");
        }
    }

【讨论】:

  • 我应该使用 Execute :)
  • @Maffelu heh,或者那个 ;p
  • 这是 Dapper 的缺点,还是用一系列参数进行查询在逻辑上没有意义? This question 有兴趣选择插入行的 ID,这在 Dapper 的当前状态下是不可能的。 This question 暗示它曾经工作 - 第一个 sn-p - 或者他们的错误与此有关?在我看来,如果Execute 可以处理一系列参数,Query 应该也可以。我能想出的最佳解决方法涉及 4 个单独的查询,这并不理想
  • @Rob 好吧,循环出现的地方不会对实际操作产生巨大影响;是的,我们可以让Query 处理一个序列并从本质上连接结果,但它会更清晰吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-01-25
  • 1970-01-01
  • 2016-01-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多