だから私は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、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.<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を実行していて、理解できません問題が何であるかを調べます。
助言がありますか?
_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");
}
}
_
クラスの代わりにインターフェイスを使用すると、次のエラーが発生しました。
Query<MyObject>
は機能しましたが、Query<IMyObject>
しませんでした