Dapper抛出“ DynamicMethod的无效类型所有者”。 [英] Dapper throws "Invalid type owner for DynamicMethod."

查看:498
本文介绍了Dapper抛出“ DynamicMethod的无效类型所有者”。的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

So I'm trying to use Dapper.net and I'm liking it. What I'm not liking is when I try to batch-insert entities and I get the following error thrown:

DynamicMethod的无效类型所有者。


在System.Reflection.Emit.DynamicMethod.Init(字符串名称,
MethodAttributes属性,CallingConventions调用Convention,
类型returnType,类型[]签名,类型拥有者,模块m,布尔
skipVisibility,布尔透明方法,StackCrawlMark& stackMark)
位于System.Reflection.Emit.DynamicMethod..ctor(字符串名称,类型
returnType,Type [] parameterTypes,类型所有者,布尔skipVisibility)Dapper.SqlMapper.CreateParamInfoGenerator上的
(身份标识,
布尔checkForDuplicates,布尔removeUnused,IList 1个常量)在
D:\Dev\dapper-dot-net\Dapper NET40\SqlMapper.cs:第3033行在
Dapper.SqlMapper.GetCacheInfo(Identity identity,Object
exampleParameters, D:\Dev\dapper-中的布尔addToCache) dot-net\Dapper
NET40\SqlMapper.cs:第2138行位于
Dapper.SqlMapper。< QueryImpl> d__61
1.MoveNext()in
D:Dev\dapper-dot-net\Dapper NET40\SqlMapper.cs:line 1578 at
System.Collections.Generic.List 1..ctor(IEnumerable 1个集合)

,位于System.Linq.Enumerable.ToList [TSource](IEnumerable 1源),位于
Dapper.SqlMapper.Query [T] (IDbConnection cnn,字符串sql,对象参数,
IDbTransaction事务,布尔缓冲,可空
1
commandTimeout,可空 1 commandType)在
中D:Dev\dapper-dot-net\Dapper NET40\SqlMapper.cs:line 1479 at
Dapper.SqlMapper.Query(IDbConnection cnn,String sql,Object param,
IDbTransaction transaction ,布尔缓冲,可空
1
commandTimeout,可空 1 commandType)在
中D:\Dev\dapper-dot-net\Dapper NET40 \SqlMapper.cs:第1418行,位于
NinjaEvaluation.Data.Database.DapperWrapper。<> c__DisplayClass 4
1.b__3($$$$ c中的SqlConnection
sqlConnection,SqlTransaction事务):\Projects\InHouse\ninjaevaluation\NinjaEvaluation\NinjaEvaluation.Data\Database\ DapperWrapper.cs:NinjaEvaluation.Data.Database.DapperWrapper.Invoke(动作2
动作)在
c中的
52行:\Projects\InHouse\ninjaevaluation\NinjaEvaluation\ NinjaEvaluation.Data\Database\DapperWrapper.cs:line
68

at System.Reflection.Emit.DynamicMethod.Init(String name, MethodAttributes attributes, 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) at Dapper.SqlMapper.CreateParamInfoGenerator(Identity identity, 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 collection)
at 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 transaction) in c:\Projects\InHouse\ninjaevaluation\NinjaEvaluation\NinjaEvaluation.Data\Database\DapperWrapper.cs:line 52 at NinjaEvaluation.Data.Database.DapperWrapper.Invoke(Action`2 action) in c:\Projects\InHouse\ninjaevaluation\NinjaEvaluation\NinjaEvaluation.Data\Database\DapperWrapper.cs:line 68

这种情况在我完全正常的情况下会发生像这样运行我的查询:

This happens in a completely normal situation when I run my query like this:

        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,但我不知道是什么问题。

I found the following SO-thread started by someone having the same problem BUT the issue there seems to have been the .NET version (3.5) but I'm running .NET 4.5 and I can't figure out what the problem is.

有什么建议吗?

推荐答案

由于此方案使用 Query [< T>] 不期望参数的数组/序列。 Execute 调用路径确实会期望这样做,并自动展开数据,对每个项目执行一次SQL-但这不是这种情况。 Query [< T>] ,因此它尝试创建绑定到 array 的动态方法(在您的情况下),这不是允许的。代码可能应该更早地检测到这一点,然后说不,那是不允许的。

It fails because this scenario using Query[<T>] isn't expecting an array / sequence of parameters. The Execute call-path does expect this, and unrolls the data automatically, executing the SQL once per item - but this isn't the case for Query[<T>], so it tries to create the dynamic method bound to the array (in your case), which isn't allowed. The code should probably detect this much earlier, and just say "nope, that isn't allowed".

可能想要更改您的 .ToArray() .Single()

下一次构建后,这将变得更加清晰;以下步骤:

This will be clearer after the next build; the following passes:

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

这篇关于Dapper抛出“ DynamicMethod的无效类型所有者”。的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆