web-dev-qa-db-ja.com

Dapperは「DynamicMethodの無効な型所有者」をスローします。

だから私はDapper.netを使おうとしています、そして私はそれが好きです。私が気に入らないのは、エンティティをバッチ挿入しようとすると、次のエラーがスローされることです。

DynamicMethodの型所有者が無効です。

system.Reflection.Emit.DynamicMethod.Init(文字列名、MethodAttributes属性、CallingConventionscallingConvention、Type returnType、Type []署名、タイプ所有者、モジュールm、ブールskipVisibility、ブールtransparentMethod、StackCrawlMark&stackMark)atSystem.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__61 1.MoveNext()in D:\ Dev\dapper-dot-net\Dapper NET40\SqlMapper.cs:line 1578 at System.Collections.Generic.List _1..ctor(IEnumerable_ 1 collection)
at System.Linq.Enumerable.ToList [TSource](IEnumerable1 source) at Dapper.SqlMapper.Query[T](IDbConnection cnn, String sql, Object param, IDbTransaction transaction, Boolean buffered, Nullable 1 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, 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 transaction) 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

これは、次のようにクエリを実行すると、完全に通常の状況で発生します。

_        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を実行していて、理解できません問題が何であるかを調べます。

助言がありますか?

15
Maffelu

_Query[<T>]_を使用するこのシナリオは、パラメーターの配列/シーケンスを予期していないため、失敗します。 Execute call-path doesこれを期待し、データを自動的に展開して、アイテムごとに1回SQLを実行します-しかし、これは_Query[<T>]_の場合ではないため、 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");
        }
    }
_
9
Marc Gravell

クラスの代わりにインターフェイスを使用すると、次のエラーが発生しました。

Query<MyObject>は機能しましたが、Query<IMyObject> しませんでした

9
Ryan