2016-09-11 4 views
1

Я EF сконфигурировано с Location поля на моей User таблице:Щеголеватый удалось привести объект типа «Microsoft.SqlServer.Types.SqlGeography» к типу «System.Data.Entity.Spatial.DbGeography»

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(); 

Я получаю следующее сообщение об ошибке:

Message=Error parsing column 122 (Location=POINT (-118.2436849 34.0522342) - Object) Source=Dapper StackTrace: at Dapper.SqlMapper.ThrowDataException(Exception ex, Int32 index, IDataReader reader, Object value) in d:\Dev\dapper-dot-net\Dapper NET40\SqlMapper.cs:line 4045 at Deserialize4650b5f0-d037-49ad-802e-8a9be95e8496(IDataReader) at 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) at Dapper.SqlMapper.Query[T](IDbConnection cnn, String sql, Object param, IDbTransaction transaction, Boolean buffered, Nullable 1 commandTimeout, Nullable 1 commandType) in d:\Dev\dapper-dot-net\Dapper NET40\SqlMapper.cs:line 1443 at App.Services.BrowseService.GetProfiles(ProfileSearchDto query, String username, Boolean isAdmin) in c:\PROJECTS\App\App-MAIN\App\Services\BrowseService.cs:line 330 InnerException: System.InvalidCastException HResult=-2147467262 Message=Unable to cast object of type 'Microsoft.SqlServer.Types.SqlGeography' to type 'System.Data.Entity.Spatial.DbGeography'.

Что вызывает это?

Update

Только для пинков, я попытался с помощью EF:

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

И я получаю другую ошибку:

Message=No mapping exists from object type <>f__AnonymousTypef`2[[System.DateTime, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089],[System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]] to a known managed provider native type. Source=System.Data

идет лысый

Заключение

Моим приложениям требуется выполнить поиск по радиусу и в настоящее время использует наивный запрос на лат/длинный бокс. Я пытался обновить свою реализацию, чтобы использовать пространственные типы, но похоже, что мой инструмент не поддерживает этот сценарий. Вернемся к наивному.

+0

http://stackoverflow.com/questions/23186832/entity-framework-sqlgeography-vs-dbgeography – Oluwafemi

+0

@Oluwafemi - я вижу. Итак ... Как заставить EF и Dapper играть хорошо с вышеуказанным запросом? – SB2055

+0

EF должен обрабатывать типы географии (но я их вообще не использую). Последняя ошибка, похоже, не связана с географией (но это может быть ошибка EF при использовании географии). «Пользователь» работает нормально, если вы используете 'context.Users.ToList()'? – bubi

ответ

6

Dapper не поддерживает типы Entity Framework в основной библиотеке, чтобы уменьшить количество зависимостей. Однако он имеет расширяемую модель типа обработчика, а привязки для DbGeography включены в пакет Dapper.EntityFramework. После того как вы добавили это, вам необходимо позвонить:

Dapper.EntityFramework.Handlers.Register(); 

, чтобы попросить надстройку зарегистрироваться. И тогда это должно сработать. Если вы получаете исключения несоответствия сборки, вы должны иметь возможность разрешить его с перенаправлением связывания сборки. Это относится, в частности, к базовому типу SqlGeography, где метаданные, возвращаемые SQL Server, представляют собой другую версию для метаданных в пакете Microsoft.SqlServer.Types. Но перенаправление с привязкой к сборке отлично работает.

+0

Работает отлично. Теперь мы находимся на «пространственном»! Спасибо, Марк. – SB2055

+0

Дальнейшие действия и пояснения: https://github.com/StackExchange/Dapper/issues/570 – JasonCoder