DbGeography с MySQL и EntityFramework

я использую DbGeography С System.Data.Entity.Spatial; и Entity Framework с базами данных SQL Server. Теперь я переключаюсь на использование сервера MySQL, и я получаю ошибку при создании базы данных, связанной с DbGeography тип.

как я могу исправить эту проблему без замены всего моего класса домена на другой тип?

public class Place
{
  ...
    public virtual int Id { get; set; }
    public string Name { get; set; }
    public DbGeography Location {get;set;}
  ...

}

ошибка, которая у меня есть, это:

System.NotSupportedException: There is no store type corresponding to the EDM type 'Edm.Geography' of primitive type 'Geography'.

2 ответов


Я прошел через кучу документов MySQL, чтобы узнать, что mysql 5.x в настоящее время не поддерживает тип данных DbGeography.

для mysql 5.X поддерживается только DbGeometry. Я расстроен.

обратитесь к документу официальный документ MySQL о поддержке пространственных данных

Entity Framework поддерживает два основных типа пространственных данных: DbGeometry и DBGeography. Второй -не поддерживается на Соединитель / сеть, так как сервер MySQL не имеет эквивалентного типа, к которому сопоставляется этот тип. Таким образом, все примеры будут использовать тип DbGeometry.

возможно, вы можете использовать точку типа данных DbGeometry для сохранения долготы и широты, а затем использовать формулу Haversine для расчета расстояния.


как указано ehe888, MySQL Connector / Net не поддерживает сопоставление с DbGeography, но поддерживает сопоставление с DbGeometry.

Если вам просто нужно хранить POINT (единственная геометрия, поддерживаемая MySQL Connector / Net с версии 6.10), то вы можете легко сделать преобразование себя между DbGeography и DbGeometry в сущности:

    [Column("gps_location")]
    public DbGeometry LocationGeometry { get; set; }

    [NotMapped] // Mapping to DbGeography is not supported by MySQL Connector/Net, see https://dev.mysql.com/doc/connector-net/en/connector-net-entityframework50.html
    public DbGeography Location
    {
        get => LocationGeometry != null ? DbGeography.FromBinary(LocationGeometry.AsBinary()) : null;
        set => LocationGeometry = value != null ? DbGeometry.FromBinary(value.AsBinary()) : null;
    }