EF5,SQL Server,经度和纬度

我发现在SQL Server中存储lat和long的最佳类型是decimal(9,6)(参考在SQL数据库中存储纬度和经度数据时使用哪种数据类型?),所以我做了

AddColumn("dbo.Table", "Latitude", c => c.Decimal(nullable: false, precision: 9, scale: 6));
AddColumn("dbo.Table", "Longitude", c => c.Decimal(nullable: false, precision: 9, scale: 6));

SQL似乎没问题,一切正常,但当我插入/更新一个值,即

lat = 44.5912853

它是这样保存的:

44.590000

我检查了流程,并且在更新之前,我的实体包含正确的值,所以我不认为与我的代码有关,而是涉及EF / SQL所做的一些操作。 你有什么想法来避免这种情况?

UPDATE

update [dbo].[Breweries]
set [RankId] = @0, 
[Name] = @1, 
[Foundation] = null, 
[DirectSale] = @2, 
[OnlineSale] = @3, 
[StreetAddress] = @4, 
[StreetAddress1] = null, 
[ZIP] = @5, 
[City] = @6, 
[Province] = @7, 
[CountryCode] = @8, 
[Latitude] = @9, 
[Longitude] = @10, 
[PIVA] = null, 
[CodFiscale] = null
where ([BreweryId] = @11)

在这里输入图像描述

POCO实体

[Table("Breweries")]
public class Brewery : ABrewery 
{
  ....
  public decimal Latitude { get; set; }
  public decimal Longitude { get; set; }
}

SQL事件探查器

exec sp_executesql N'update [dbo].[Breweries]
set [RankId] = @0, [Name] = @1, [Foundation] = null, [DirectSale] = @2, [OnlineSale] = @3, [StreetAddress] = @4, [StreetAddress1] = null, [ZIP] = @5, [City] = @6, [Province] = @7, [CountryCode] = @8, [Latitude] = @9, [Longitude] = @10, [PIVA] = null, [CodFiscale] = null
where ([BreweryId] = @11)
',N'@0 int,@1 nvarchar(128),@2 bit,@3 bit,@4 nvarchar(256),@5 varchar(16),@6 nvarchar(64),@7 nvarchar(64),@8 nvarchar(128),@9 decimal(18,2),@10 decimal(18,2),@11 int',@0=2,@1=N'Davide',@2=0,@3=0,@4=N'Via Moscardini, 24',@5='zip',@6=N'city',@7=N'province',@8=N'ITA',

@9=44.59,@10=11.05,@11=2

谢谢


显然这个人有完全相同的问题,并解决了这个问题:

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    modelBuilder.Entity<Activity>().Property(a => a.Latitude).HasPrecision(18, 9);
    modelBuilder.Entity<Activity>().Property(a => a.Longitude).HasPrecision(18, 9);
}

尽管您可能想要查看SQL Server 2008及更高版本中使用空间数据类型(特别是geography )。


您可以使用DbGeography类型来存储经度和纬度。

using System.Data.Entity.Spatial;

public class Test
{
    public DbGeography Location { get; set; }
}

两件事情:

  • 我刚刚购买了一个邮政编码数据库,它将所有纬度和经度值存储为十进制(12,6)数据类型。 我不认为这将会彻底改变你的结果。

  • 我会检查发送到SQL Server的确切的SQL。 然后您可以检查以查看舍入的发生位置。 您可以通过抓取EF输出或使用SQL Profiler来检查发送的SQL。 我的猜测是它出现在你的C#代码中。

  • 此外,查看您的表架构和您的域实体可能会很有用。

    链接地址: http://www.djcxy.com/p/93909.html

    上一篇: EF5, SQL Server, Longitude and Latitude

    下一篇: MySQL latitude and Longitude table setup