我正在使用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'.
答案 0 :(得分:4)
我已经浏览了一堆MySQL文档,发现mysql 5.x目前不支持DbGeography数据类型。
对于mysql 5.x,仅支持DbGeometry。我很沮丧。
参考文件MySQL Official Document about Spatial Data Support
实体框架支持空间数据的两种主要类型:DbGeometry和DBGeography。第二个是在Connector / Net上支持 NOT ,因为MySQL服务器没有任何与此类型映射的等效类型。所以所有示例都将使用DbGeometry类型。
也许您可以使用DbGeometry数据类型POINT来保存经度和纬度,然后使用Haversine公式来计算距离。
答案 1 :(得分:0)
正如ehe888所指出的,MySQL Connector / Net不支持映射到DbGeography
,但支持映射到DbGeometry
。
如果您只需要存储POINT
(the only geometry supported by MySQL Connector/Net as of version 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;
}