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(IEnumerable1 collection) at System.Linq.Enumerable.ToList[TSource](IEnumerable
1 source)在Dapper.SqlMapper。查询[T](IDbConnection cnn, String sql, Object param, IDbTransaction transaction, Boolean buffered, Nullable1 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在核心库中不支持实体框架类型,以减少依赖的数量。但是,它有一个可扩展的类型处理程序模型,并且DbGeography
的绑定包含在Dapper.EntityFramework
包中。添加完之后,需要调用:
Dapper.EntityFramework.Handlers.Register();
要求外接程序注册自己。然后就可以了。如果出现程序集不匹配异常,应该能够使用程序集绑定重定向来解决它。这尤其适用于底层SqlGeography
类型,其中SQL Server返回的元数据与Microsoft.SqlServer.Types
包中的元数据是不同的版本。但是程序集绑定重定向也可以。