EF5, SQL Server, долгота и широта
Я обнаружил, что лучший тип хранения lat и long в SQL Server является десятичным (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)
![enter image description here]()
Объект 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
Спасибо
Ответы
Ответ 1
По-видимому этот парень имел ту же самую проблему и решил его таким образом:
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);
}
Хотя вы можете посмотреть на использование пространственных типов данных (в частности geography
) в SQL Server 2008 и более поздних версий.
Ответ 2
Вы можете использовать тип DbGeography для хранения широты и долготы.
using System.Data.Entity.Spatial;
public class Test
{
public DbGeography Location { get; set; }
}
Ответ 3
Две вещи:
-
Я только что приобрел базу данных Zip-кода и сохраняет все значения широты и долготы в виде десятичного (12,6) типа данных. Я не думаю, что это радикально изменит ваши результаты.
-
Я бы проверил точное отправление SQL на ваш SQL Server. Затем вы можете проверить, где происходит округление. Вы можете проверить отправленный SQL, захватив вывод из EF или используя SQL Profiler. Я предполагаю, что это происходит в коде С#.
Кроме того, было бы полезно увидеть схему вашей таблицы и объект домена.
Ответ 4
Используйте тип данных этих полей как Float:
Latitude float,
Longitude float