2013-02-23 1 views
11

Я обнаружил, что лучший тип для хранения и лат долго в SQL Server десятичный (9,6) (см. What datatype to use when storing latitude and longitude data in SQL databases?), и поэтому я сделалEF5, SQL Server, Долгота и Широта

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

ПОКО объект

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

SQL Profiler

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 

Благодаря

ответ

8

По-видимому this guy had the exact same problem и решил его таким образом:

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); 
} 

Хотя вы можете захотеть взглянуть на использовании spatial data types (особенно geography) в SQL Server 2008 и более поздних версий.

+0

Я видел «HasPrecision», но даже если я добавлю пространство имен, я получаю сообщение об ошибке, когда пытаюсь его использовать (метод не найден) – Davide

+0

Доступно ли 'Property'? –

+0

Да, ни intellisense не нашел. Я думал, что это старая версия, и я пробовал по-другому .. но я попробую еще раз, почему у меня нет этой опоры. – Davide

1

Две вещи:

  1. Я только что купил базу данных Zip код и сохраняет все значения широты и долготы в виде десятичных (12,6) типа данных. Я не думаю, что это радикально изменит ваши результаты.

  2. Я бы проверил точное отправление SQL на ваш SQL Server. Затем вы можете проверить, где происходит округление. Вы можете проверить отправленный SQL, захватив вывод из EF или используя SQL Profiler. Я предполагаю, что это происходит в коде C#.

Кроме того, было бы полезно увидеть схему таблиц и объект домена.

+0

я разместил скриншот таблицы БД и то, что я вижу в IntelliTrace (не очень полезно, я думаю, если вы скажете мне, как лучше захватить выход из EF, я отправлю его) – Davide

+0

насчет вашего Объект C#? –

+0

просто свойство, десятичный тип (обновлено сообщение) – Davide

0

Используйте тип данных этих полей, как Float:

Latitude float, 
Longitude float 
2

Вы можете использовать тип DbGeography для хранения широты и долготы.

using System.Data.Entity.Spatial; 

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

 Смежные вопросы

  • Нет связанных вопросов^_^