OData + EF。写地理类型

时间:2014-05-10 12:08:48

标签: entity-framework odata entity-framework-6

我有一个Odata服务,它公开了EF6代码的第一个模型。其中一些实体包括DbGeography字段。我可以获取这些字段,尽管DbGeography字段具有相当丑陋的序列化格式,但我无法弄清楚如何POST或PUT实体到服务。 DbGeography类型似乎很难反序列化。

任何人都可以提供如何做到这一点的示例或链接吗?

2 个答案:

答案 0 :(得分:2)

我也遇到过这个问题。它显然是一个错误。

此处有两个选项 - 旧版System.Data.Entity.DbGeography下拉到EF5(而不是System.Data.Entity.Spatial.DbGeography),或者等到修补它们。

编辑:已经很长时间了,到目前为止我唯一提到的黑客是这种写入属性并隐藏丑陋的序列化格式的方法(但是仍然无法查询它。< / p>

    private bool hasSetLongitude = false;
    private bool hasSetLatitiude = false;
    private double? longitude = null;
    private double? latitiude = null;

    /// <summary>
    /// Get or set the coordinates.
    /// </summary>
    [Column("engi_coord"), Required]
    public DbGeography Coordinates { get; set; }

    /// <summary>
    /// Get or set the lang coordinates.
    /// </summary>
    [Column("engi_lng"), DatabaseGenerated(DatabaseGeneratedOption.Computed)]
    public double? Longitude
    {
        get 
        { 
            return this.Coordinates != null ? this.Coordinates.Longitude : (double?)null; 
        }
        set 
        {
            this.longitude = value;
            this.hasSetLongitude = true;
            if (this.hasSetLongitude)
            {
                if (this.longitude.HasValue &&
                    this.latitiude.HasValue)
                {
                    this.Coordinates = DbGeography.PointFromText(string.Format("POINT({0} {1})", this.longitude.Value, this.latitiude.Value), 4326);
                }
                else
                {
                    this.Coordinates = null;
                }
            }
        }
    }

    /// <summary>
    /// Get or set the lat coordinates.
    /// </summary>
    [Column("engi_lat"), DatabaseGenerated(DatabaseGeneratedOption.Computed)]
    public double? Latitude
    {
        get 
        { 
            return this.Coordinates != null ? this.Coordinates.Latitude : (double?)null; 
        }
        set 
        {
            this.latitiude = value;
            this.hasSetLatitiude = true;
            if (this.hasSetLatitiude)
            {
                if (this.longitude.HasValue &&
                    this.latitiude.HasValue)
                {
                    this.Coordinates = DbGeography.PointFromText(string.Format("POINT({0} {1})", this.longitude.Value, this.latitiude.Value), 4326);
                }
                else
                {
                    this.Coordinates = null;
                }
            }
        }
    }

迁移以添加计算列:

        this.Sql("ALTER TABLE dbo.engi_engineer ADD engi_lng AS engi_coord.Long");
        this.Sql("ALTER TABLE dbo.engi_engineer ADD engi_lat AS engi_coord.Lat");

现在忽略API中的coordinates属性:

        this.EntityType.Ignore(p => p.Coordinates);

答案 1 :(得分:0)

现在已经过了一年多了,看起来这很快就会得到解决。特别是EF7即将推出。

所以,我想以另一种方式处理。
如果DbGeography类型没有作为类的属性公开,而是我们公开未映射的Latitude和Longitude属性,然后在他们的GET / SET上我们更新隐藏的DbGeography属性,该怎么办?

我试过这个但是EF没有成功 你可以做的是在POST / PUT控制器内部调用是使用存储过程或SQL文本来更新数据。

如果我发现如何使用EF,我会在这里发布。