Entity Framework MySql: DbGeometry не читается из БД - PullRequest
0 голосов
/ 31 мая 2018

У меня есть эта модель:

public partial class UserPosition
{
    ...
    public DbGeometry Position { get; set; }
    ...
}

Я создаю этот объект и сохраняю его в БД MySql (db - это мой DBContext):

var pos = new UserPosition
{
    ...
    Position = GeographyHelper.CreatePoint(request.Latitude, request.Longitude),
    ...
};

db.UserPositions.Add(pos);
db.SaveChanges();

GeographyHelper.CreatePoint:

/// <summary>
/// Creates a DbGeometry point from latitude and longitude values
/// </summary>
/// <param name="latitude"></param>
/// <param name="longitude"></param>
/// <returns></returns>
public static DbGeometry CreatePoint(double latitude, double longitude)
{
    var text = string.Format(CultureInfo.InvariantCulture.NumberFormat, "POINT({0} {1})", longitude, latitude);

    // 4326 is most common coordinate system used by GPS/Maps
    return DbGeometry.PointFromText(text, 4326);
}

Значение отлично сохраняется в БД:

POINT (19.038934 47.531)

Но когда я читаю значение из БД, позиция становится пустой, остальные поля в порядке:

var rec = db.UserPositions.FirstOrDefault()

Я получаю правильную запись, потому что идентификатор совпадает.

Почему позиция пуста?

Visual Studio 2015, .NET 4.5.2, EntityFramework 6.2.0, MySql.Data.Entity.EF6 6.9.12, версия базы данных MySql: 5.6.15.

1 Ответ

0 голосов
/ 31 мая 2018

Это была проблема глобализации: десятичная точка сохранялась в БД, но не могла анализировать те же данные геометрии при чтении, потому что требовалась десятичная запятая (для Double.TryParse()) из-за глобализации.Быстрое решение состояло в том, чтобы установить глобализацию на en-US в web.config, но я согласен, если вы знаете лучшее решение:)

<configuration>
  <system.web>
    <globalization uiCulture="en-US" culture="en-US"/>
    ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...