EF5, SQL Server, Longitudine e Latitudine

Ho trovato che il tipo migliore per archiviare lat e long in SQL Server è decimale (9,6) (riferimento quale tipo di dati da utilizzare quando si memorizzano i dati di latitudine e longitudine nei database SQL? ) E così ho fatto

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 sembra ok, tutto funziona, MA quando inserisco / aggiorno un valore, es

 lat = 44.5912853 

è salvato in questo modo:

 44.590000 

Ho controllato il stream e, appena prima dell’aggiornamento, la mia quadro contiene il valore corretto, quindi non penso sia correlato al mio codice, ma a un certo punto di quello che fa EF / SQL. Hai qualche idea per evitarlo?

AGGIORNARE

 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) 

inserisci la descrizione dell'immagine qui

Entità POCO

 [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 

Grazie

Apparentemente questo ragazzo ha avuto lo stesso identico problema e lo ha risolto così:

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

Anche se si consiglia di utilizzare i tipi di dati spaziali (in particolare la geography ) in SQL Server 2008 e versioni successive.

È ansible utilizzare il tipo DbGeography per la memorizzazione di Latitudine e Longitudine.

 using System.Data.Entity.Spatial; public class Test { public DbGeography Location { get; set; } } 

Due cose:

  1. Ho appena acquistato un database di codice postale e memorizza tutti i valori di latitudine e longitudine come tipo di dati decimali (12,6). Non penso che questo cambierà radicalmente i risultati.

  2. Vorrei controllare l’esatto SQL inviato al tuo SQL Server. È quindi ansible controllare per vedere dove si sta verificando l’arrotondamento. È ansible controllare l’SQL inviato catturando l’output da EF o utilizzando SQL Profiler. La mia ipotesi è che si verifichi nel tuo codice C #.

Inoltre, potrebbe essere utile vedere lo schema della tabella e l’ quadro del dominio.

Utilizza il tipo di dati di questi campi come Float:

  Latitude float, Longitude float