2014-08-27 5 views
5

Ho un database di SQL Server 2012 con una tabella che contiene una colonna digeografia e voglio usare Dapper in un'applicazione .NET lavorare con quel database , ma per quanto posso dire e vedere nel codice Dapper, "solo" il tipo DBGeography di Entity Framework è supported, il tipo di dati SQLGeography sottostante non ha altre menzioni nel repository.Come utilizzare Dapper con MS SQL Server (2012) Geospatial/SqlGeography Colonna

Dapper può gestire questi tipi di colonna "magicamente" tuttavia o dovrei scrivere esplicitamente un Dapper.SqlMapper.TypeHandler per questi?

+0

Che tipo (s) stai usando attualmente per mappare questi? Stai usando 'SqlGeography' direttamente? o...? –

+0

correlati; http://stackoverflow.com/questions/6690565/using-dapper-with-sql-spatial-types-as-a-parameter/25544690#25544690 e http://stackoverflow.com/questions/12090549/mapping-sqlgeography- with-dapper? lq = 1 –

risposta

6

supporto per SqlGeography è stato aggiunto nella prossima release, ancora una volta tramite il pacchettoDapper.EntityFramework. Non ho ancora creato/implementato, dato che ho due idee sul fatto che sia l'assemblaggio più appropriato in cui vivere ... ma non voglio prendere dipendenza da Microsoft.SqlServer.Types nella libreria principale. Potrebbe esserci un modo per farlo senza quello, però.


Aggiornamento: questo è ora spostata di un livello alla libreria di base, in modo da non dovrebbe essere necessario alcun riferimento EF o Dapper.EntityFramework; dovrebbe funzionare solo; questo è stato spinto come Dapper 1.32.

Esempio:

public void SqlGeography_SO25538154() 
{ 
    Dapper.SqlMapper.ResetTypeHandlers(); // to show it doesn't depend on any 
    connection.Execute("create table #SqlGeo (id int, geo geography)"); 

    var obj = new HazSqlGeo 
    { 
     Id = 1, 
     Geo = SqlGeography.STLineFromText(
      new SqlChars(new SqlString(
       "LINESTRING(-122.360 47.656, -122.343 47.656)")), 4326) 
    }; 
    connection.Execute("insert #SqlGeo(id, geo) values (@Id, @Geo)", obj); 
    var row = connection.Query<HazSqlGeo>(
     "select * from #SqlGeo where id=1").SingleOrDefault(); 
    row.IsNotNull(); 
    row.Id.IsEqualTo(1); 
    row.Geo.IsNotNull(); 
} 

class HazSqlGeo 
{ 
    public int Id { get; set; } 
    public SqlGeography Geo { get; set; } 
} 
+0

Fantastico, è esattamente quello che stavo cercando/sperando - grazie Marc! –

+0

@ JörgB. fammi sapere se hai problemi, ecc. –

+0

Farai una prova approfondita oggi. –