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, IList
1 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__61
1.MoveNext () in D:Devdapper-dot-netDapper NET40SqlMapper.cs: линия 1578 at Система.Коллекции.Родовой.Список1..ctor(IEnumerable
1 коллекция)
на Система.В LINQ.Перечислимый.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:Devdapper-dot-netDapper NET40SqlMapper.cs:line 1479 at Dapper.SqlMapper.Query(IDbConnection cnn, String sql, Object param, IDbTransaction transaction, Boolean buffered, Nullable
1 commandTimeout, Nullable1 commandType) in D:Devdapper-dot-netDapper NET40SqlMapper.cs:line 1418 at NinjaEvaluation.Data.Database.DapperWrapper.<>c__DisplayClass4
1.Б__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>
не