Dapper бросает " недопустимый владелец типа для DynamicMethod."

поэтому я пытаюсь использовать Dapper.net и мне это нравится. Что мне не нравится, так это когда я пытаюсь пакетная вставка сущностей, и я получаю следующую ошибку:

недопустимый владелец типа для DynamicMethod.

в систему.Отображение.Испускают.Создает.Init (имя строки, MethodAttributes атрибуты, CallingConventions callingConvention, Тип returnType, тип [] подпись, владелец типа, модуль m, логический skipVisibility, логическое transparentMethod, StackCrawlMark& stackMark) в системе.Отображение.Испускают.Создает..ctor (имя строки, тип returnType, Type[] parameterTypes, владелец типа, логическая пропускаемость) в Dapper.SqlMapper.CreateParamInfoGenerator (идентичность идентичности, Boolean checkForDuplicates, Boolean removeUnused, IList1 literals) in D:Devdapper-dot-netDapper NET40SqlMapper.cs:line 3033 at Dapper.SqlMapper.GetCacheInfo(Identity identity, Object exampleParameters, Boolean addToCache) in D:Devdapper-dot-netDapper NET40SqlMapper.cs:line 2138 at Dapper.SqlMapper.<QueryImpl>d__611.MoveNext () in D:Devdapper-dot-netDapper NET40SqlMapper.cs: линия 1578 at Система.Коллекции.Родовой.Список1..ctor(IEnumerable1 коллекция)
на Система.В LINQ.Перечислимый.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:Devdapper-dot-netDapper NET40SqlMapper.cs:line 1479 at Dapper.SqlMapper.Query(IDbConnection cnn, String sql, Object param, IDbTransaction transaction, Boolean buffered, Nullable1 commandTimeout, Nullable1 commandType) in D:Devdapper-dot-netDapper NET40SqlMapper.cs:line 1418 at NinjaEvaluation.Data.Database.DapperWrapper.<>c__DisplayClass41.Б__3(объект sqlconnection sqlconnection, транзакция SqlTransaction) в c:ProjectsInHouseninjaevaluationNinjaEvaluationNinjaEvaluation.DataDatabaseDapperWrapper.cs: линия 52 в Нинджаеве.Данные.База данных.DapperWrapper.Вызов(Действие 2 действие) в c:ProjectsInHouseninjaevaluationNinjaEvaluationNinjaEvaluation.DataDatabaseDapperWrapper.cs: линия 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-thread запущен кем-то с той же проблемой, но проблема, похоже, была .NET-версия (3.5), но я запускаю .NET 4.5, и я не могу понять, в чем проблема.

какие предложения?

3 ответов


это не потому, что этот сценарий с помощью Query[<T>] не ожидает массив / последовательность параметров. The Execute call-path тут ожидайте этого и разворачивайте данные автоматически, выполняя SQL один раз за элемент - но это не относится к Query[<T>], поэтому он пытается создать динамический метод привязан к массив (в вашем случае), что не допускается. Код, вероятно, должен обнаружить это намного раньше и просто сказать "нет, это не разрешено".

вы наверное хотите изменить свою .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 был сильно набран в коллекцию, например:Query<IEnumerable<string>>

когда это должно быть только Query<string>


я столкнулся с этой ошибкой при использовании интерфейс, а не класс:

Query<MyObject>, а Query<IMyObject> не