Невозможно сопоставить столбцы SQL Geography с классом EF DbGeography с dapper

c# dapper entity-framework sql sqlgeography

Вопрос

У меня есть таблица с sql-географией в моей базе данных SQL. Я создал объекты для моей базы данных с EF6. Как вы знаете, Entitiy Framework генерирует System.Data.Entity.Spatial.DbGeography для типа географии SQL. Я использую dapper для запуска запросов и сопоставления результатов с моими созданными EF объектами.

Класс сущности

public partial class Fix
{
    public Fix()
    {
        this.FixUsers = new HashSet<FixUser>();
    }

    public long FixID { get; set; }
    public long UserID { get; set; }
    public System.Data.Entity.Spatial.DbGeography Position { get; set; }
    public int Radius { get; set; }
    public System.DateTime CreatedDate { get; set; }

    public virtual MemberProfile MemberProfile { get; set; }
    public virtual ICollection<FixUser> FixUsers { get; set; }
}

SQL-запрос, который генерирует исключение

    var fix = SqlConnection.Query<Fix>(@"SELECT TOP(1) 
                                         f.FixID as FixID, 
                                         f.UserID as UserID, 
                                         f.Radius as Radius, 
                                         f.CreatedDate as CreatedDate, 
                                         f.Position as Position
                                         FROM [Fix] f 
                                         WHERE f.FixID = @fixId", new { fixId }).FirstOrDefault();

Вот снимок исключения

введите описание изображения здесь

Я думаю, что по умолчанию dapper пытается сопоставить Microsoft.SqlServer.Types.SqlGeography .

Есть ли какое-нибудь обходное решение?

РЕДАКТИРОВАНИЕ

Нашел некоторое решение, создал частичный класс для моего объекта

public partial class Fix
{
    public string PositionString
    {
        set
        {
            Position = DbGeography.PointFromText(value, 4326);
        }
    }
}

И изменил мой запрос

var fix = SqlConnection.Query<Fix>(@"SELECT TOP(1) 
                                     f.FixID as FixID, 
                                     f.UserID as UserID, 
                                     f.Radius as Radius, 
                                     f.CreatedDate as CreatedDate, 
                                     f.Position.ToString() as PositionString
                                     FROM [Fix] f 
                                     WHERE f.FixID = @fixId", new { fixId }).FirstOrDefault();

Ответ эксперта

Dapper имеет встроенную поддержку многих распространенных типов данных, но не всех. Вы можете использовать пользовательский параметр запроса - вы можете увидеть, как из этого коммита добавлена ​​пользовательская поддержка параметров таблицы, как DataTable . Я бы очень неохотно добавлял все, что требовало дополнительных зависимостей, особенно для таких вещей, как EF. Возможно, в будущем это может быть полезным, это настраиваемый инструмент регистрации для пользовательских поставщиков (позволяющий данным в параметрах быть чем угодно - перемещение туда, где происходит карта). Однако этого не существует.


Популярные ответы

Если вы действительно хотите использовать Dapper, вы можете преобразовать SqlGeography в DbGeography:

DbGeography.FromText(sqlGeo.ToString());

Так что просто преобразование в память, или вы также можете просто использовать SQL с EF:

dbContext.Fixes.SqlQuery("SELECT TOP(1) 
                                     f.FixID, 
                                     f.UserID, 
                                     f.Radius, 
                                     f.CreatedDate, 
                                     f.Position
                                     FROM [Fix] f 
                                     WHERE f.FixID = @fixId", new SqlParameter("fixId", fixId)).FirstOrDefault();

или просто использовать Entity Framework обычным способом? Поскольку это не сложный запрос :)

dbContext.Fixes.Find(fixId);

Мне все еще интересно, почему вы запрашиваете с Dapper, чтобы затем сопоставить его с Entities from EF



Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow
Является ли этот КБ законным? Да, узнайте, почему
Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow
Является ли этот КБ законным? Да, узнайте, почему