DbGeography with MySQL and EntityFramework
本文关键字:EntityFramework and MySQL with DbGeography | 更新日期: 2023-09-27 18:15:37
我使用DbGeography
从System.Data.Entity.Spatial;
和实体框架与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'.
我已经浏览了一堆MySQL文档来发现MySQL 5。x当前不支持DbGeography数据类型。
For mysql仅支持DbGeometry。我很沮丧。
请参考文档MySQL官方文档关于空间数据支持
实体框架支持两种主要的空间数据类型:DbGeometry和DBGeography。第二个是Connector/Net支持的NOT,因为MySQL服务器没有任何与此类型对应的等效类型。因此,所有示例都将使用DbGeometry类型。
也许您可以使用DbGeometry数据类型POINT保存经纬度,然后使用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;
}