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;
}