Dapper lève "propriétaire de type non valide pour DynamicMethod."

c# dapper

Question

J'essaie donc d'utiliser Dapper.net et je l'aime. Ce que je n'aime pas, c'est lorsque j'essaie d'insérer par lots des entités et que l'erreur suivante s'affiche:

Propriétaire de type non valide pour DynamicMethod.

at System.Reflection.Emit.DynamicMethod.Init (nom de chaîne, attributs MethodAttributes, CallingConventions callingConvention, type returnType, signature de type [], propriétaire du type, module m, skipVisibility booléen, Boolean transparentMethod, StackCrawlMark et stackMark) à System.Reflection.Emit. DynamicMethod..ctor (Nom de la chaîne, Type returnType, Type [] parameterTypes, Type owner, Boolean skipVisibility) à Dapper.SqlMapper.CreateParamInfoGenerator (Identity identité, 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 () dans D: \ Dev \ dapper-dot-net \ Dapper NET40 \ SqlMapper.cs: ligne 1578 à System.Collections.Generic.List 1..ctor(IEnumerable 1 collection)
at System.Linq.Enumerable.ToList [TSource] ( 1 source) at Dapper.SqlMapper.Query[T](IDbConnection cnn, String sql, Object param, IDbTransaction transaction, Boolean buffered, Nullable IEnumerable 1 source) at Dapper.SqlMapper.Query[T](IDbConnection cnn, String sql, Object param, IDbTransaction transaction, Boolean buffered, Nullable 1 commandTimeout, type de commande Nullable 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, Nullable 1 commandTimeout, type de commande 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 (transaction SqlConnection sqlConnection, SqlTransaction) dans c: \ Projects \ InHouse \ ninjaevaluation \ NinjaEvaluation \ NinjaEvaluation.Data \ Database \ DapperWrapper.cs: ligne 52 à NinjaEvaluation.Data.Database.DapperWrapper.Invoke (Action`2 action) dans c: \ Projects \ InHouse \ ninjaevaluation \ NinjaEvaluation \ NinjaEvaluation.Data \ Database \ DapperWrapper.cs: ligne 68

Cela se produit dans une situation tout à fait normale lorsque je lance ma requête comme ceci:

        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)

J'ai trouvé le thread SO suivant lancé par quelqu'un ayant le même problème MAIS le problème semble être la version .NET (3.5) mais j'utilise .NET 4.5 et je n'arrive pas à comprendre le problème.

Aucune suggestion?

Réponse acceptée

Il échoue car ce scénario utilisant Query[<T>] n'attend pas de tableau / séquence de paramètres. Le Execute appel chemin ne s'attend cela, et automatiquement les données se déroule, exécuter SQL une fois par article - mais ce n'est pas le cas pour la Query[<T>] , il essaie donc de créer la méthode dynamique liée à la matrice ( dans votre cas), ce qui n'est pas autorisé. Le code devrait probablement le détecter beaucoup plus tôt et dire "non, ce n'est pas permis".

Vous voulez probablement changer votre .ToArray() à .Single() .

Ce sera plus clair après la prochaine construction; les passes suivantes:

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

Réponse populaire

J'ai rencontré cette erreur lorsque Query été fortement typé dans une collection, comme suit: Query<IEnumerable<string>>

Quand cela ne devrait être que Query<string>


Notez que l'explication ci-dessus peut ne pas être correcte, voir la réponse de @ Ryan



Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi