Dapper unable to cast object of type 'Microsoft.SqlServe

本文关键字:Microsoft SqlServe type of unable to cast object Dapper | 更新日期: 2023-09-27 18:06:31

我已经在我的User表上配置了一个Location字段:

 public DbGeography Location { get; set; }

然而,当我查询我的User表:

 user = connection.Query<User>("update [User] set LastOnline = @lastOnline output INSERTED.* where Username = @un",
                        new { lastOnline = DateTime.UtcNow, un = username }).First();

我得到以下错误:

消息=解析列122 (Location=POINT (-118.2436849 .34.0522342) - Object) Source=Dapper StackTrace:在Dapper.SqlMapper。抛出数据异常(异常ex, Int32索引,IDataReader阅读器,对象值)d:'Dev' Dapper -dot-net'Dapper NET40'SqlMapper.cs:line 4045IDataReader (IDataReader)在Dapper.SqlMapper。d__11 1.MoveNext() in d:'Dev'dapper-dot-net'Dapper NET40'SqlMapper.cs:line 1572 at System.Collections.Generic.List 1..ctor(IEnumerable 1 collection) at System.Linq.Enumerable.ToList[TSource](IEnumerable 1 source)在Dapper.SqlMapper。查询[T](IDbConnection cnn, String sql, Object param, IDbTransaction transaction, Boolean buffered, Nullable 1 commandTimeout, Nullable 1 commandType) ind:'Dev' Dapper -dot-net'Dapper NET40'SqlMapper.cs:第1443行在App.Services.BrowseService。GetProfiles(ProfileSearchDto查询,字符串用户名,布尔值isAdmin)项目c: ' ' App ' ' BrowseService.cs App-MAIN ' App '服务:330行InnerException:系统。InvalidCastExceptionHResult = -2147467262消息=无法强制转换类型为"Microsoft.SqlServer.Types"的对象。SqlGeography’输入"System.Data.Entity.Spatial.DbGeography"。

是什么原因造成的?

只是为了好玩,我试着用EF:

db.Database.SqlQuery<User>("bla bla")

我得到了一个不同的错误:

消息=不存在对象类型的映射& lt;> f__AnonymousTypef 2[[系统。DateTime, mscorlib, Version=4.0.0.0,文化=中立,都必须要]、[系统。字符串,mscorlib, Version=4.0.0.0, Culture=neutral,PublicKeyToken=b77a5c561934e089]]到已知托管提供商本机类型。源=系统。数据

是秃头

结论

我的应用程序需要按半径搜索,目前使用幼稚的后/长框查询。我试图升级我的实现以使用空间类型,但看起来我的工具不支持这种场景。回到天真的我去。

Dapper unable to cast object of type 'Microsoft.SqlServe

Dapper在核心库中不支持实体框架类型,以减少依赖的数量。但是,它有一个可扩展的类型处理程序模型,并且DbGeography的绑定包含在Dapper.EntityFramework包中。添加完之后,需要调用:

Dapper.EntityFramework.Handlers.Register();

要求外接程序注册自己。然后就可以了。如果出现程序集不匹配异常,应该能够使用程序集绑定重定向来解决它。这尤其适用于底层SqlGeography类型,其中SQL Server返回的元数据与Microsoft.SqlServer.Types包中的元数据是不同的版本。但是程序集绑定重定向也可以。