Dapper无法将“Microsoft.SqlServer.Types.SqlGeography”类型的对象强制转换为“System.Data.Entity.Spatial.DbGeography”

时间:2016-09-11 21:22:11

标签: c# sql-server entity-framework linq dapper

我的EF在我的Location表格中配置了User字段:

 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时出错(位置= POINT(-118.2436849   34.0522342) - Object)Source = Dapper StackTrace:          在Dapper.SqlMapper.ThrowDataException(Exception ex,Int32 index,IDataReader reader,Object value)in   d:\ Dev \ dapper-dot-net \ Dapper NET40 \ SqlMapper.cs:4045行          在Deserialize4650b5f0-d037-49ad-802e-8a9be95e8496(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来源)          在Dapper.SqlMapper.Query [T](IDbConnection cnn,String sql,Object param,IDbTransaction事务,Boolean buffered,Nullable 1 commandTimeout, Nullable 1 commandType)in   d:\ Dev \ dapper-dot-net \ Dapper NET40 \ SqlMapper.cs:第1443行          在App.Services.BrowseService.GetProfiles(ProfileSearchDto查询,String username,Boolean isAdmin)中   c:\ PROJECTS \ App \ App-MAIN \ App \ Services \ BrowseService.cs:第330行   InnerException:System.InvalidCastException          的HResult = -2147467262          Message =无法将类型为“Microsoft.SqlServer.Types.SqlGeography”的对象强制转换为键入   'System.Data.Entity.Spatial.DbGeography'。

造成这种情况的原因是什么?

更新

只是为了踢,我尝试使用EF:

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

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

  

消息=对象类型不存在映射   &lt;&gt; f__AnonymousTypef`2 [[System.DateTime,mscorlib,Version = 4.0.0.0,   Culture = neutral,PublicKeyToken = b77a5c561934e089],[System.String,   mscorlib,版本= 4.0.0.0,文化=中性,   PublicKeyToken = b77a5c561934e089]]到已知的托管提供商本机   类型。源= System.Data

秃头

结论

我的应用需要按半径搜索,目前使用的是天真的lat / long盒装查询。我试图升级我的实现以使用空间类型,但看起来我的工具不支持这种情况。回到天真,我走了。

1 个答案:

答案 0 :(得分:7)

Dapper不支持核心库中的实体框架类型,以减少依赖项的数量。但是,它具有可扩展的类型处理程序模型,DbGeography包中包含Dapper.EntityFramework.Handlers.Register(); 的绑定。添加完之后,您需要致电:

SqlGeography

要求加载项注册自己。然后它应该工作。如果您遇到程序集不匹配异常,则应该能够使用程序集绑定重定向来解决它。这特别适用于基础Microsoft.SqlServer.Types类型,其中SQL Server返回的元数据与>>> df[['Id', 'NAME']].groupby('Id').agg(lambda x: ', '.join(x)) NAME Id 276956 A, B, C 287266 D 包中的元数据的版本不同。但是程序集绑定重定向工作正常。