Impossibile mappare la colonna SQL Geography alla classe EF DbGeography con dapper

c# dapper entity-framework sql sqlgeography

Domanda

Ho una tabella con la colonna di geografia sql nel mio database SQL. Ho generato entità per il mio database con EF6. Come sapete, Entitiy Framework genera System.Data.Entity.Spatial.DbGeography per il tipo di geografia SQL. Sto usando dapper per eseguire query e mappare i risultati nelle mie entità generate EF.

La mia classe di entità

public partial class Fix
{
    public Fix()
    {
        this.FixUsers = new HashSet<FixUser>();
    }

    public long FixID { get; set; }
    public long UserID { get; set; }
    public System.Data.Entity.Spatial.DbGeography Position { get; set; }
    public int Radius { get; set; }
    public System.DateTime CreatedDate { get; set; }

    public virtual MemberProfile MemberProfile { get; set; }
    public virtual ICollection<FixUser> FixUsers { get; set; }
}

Query SQL che genera un'eccezione

    var fix = SqlConnection.Query<Fix>(@"SELECT TOP(1) 
                                         f.FixID as FixID, 
                                         f.UserID as UserID, 
                                         f.Radius as Radius, 
                                         f.CreatedDate as CreatedDate, 
                                         f.Position as Position
                                         FROM [Fix] f 
                                         WHERE f.FixID = @fixId", new { fixId }).FirstOrDefault();

Ecco un'istantanea delle eccezioni

inserisci la descrizione dell'immagine qui

Per impostazione predefinita, dapper sta provando a mappare a Microsoft.SqlServer.Types.SqlGeography .

C'è qualche soluzione qui?

MODIFICATO

Ho trovato una soluzione, ho creato una classe parziale per la mia entità

public partial class Fix
{
    public string PositionString
    {
        set
        {
            Position = DbGeography.PointFromText(value, 4326);
        }
    }
}

E ha cambiato la mia richiesta

var fix = SqlConnection.Query<Fix>(@"SELECT TOP(1) 
                                     f.FixID as FixID, 
                                     f.UserID as UserID, 
                                     f.Radius as Radius, 
                                     f.CreatedDate as CreatedDate, 
                                     f.Position.ToString() as PositionString
                                     FROM [Fix] f 
                                     WHERE f.FixID = @fixId", new { fixId }).FirstOrDefault();

Risposta esperta

Dapper ha un supporto integrato per molti tipi di dati comuni, ma non tutti. Potresti considerare l'utilizzo di un parametro di query personalizzato: puoi vedere come da questo commit che aggiunge il supporto personalizzato per i parametri con valori di tabella come DataTable . Sarei molto riluttante ad aggiungere qualcosa che richiede dipendenze aggiuntive, specialmente per cose come EF. Ciò che forse potrebbe essere utile in futuro è uno strumento di registrazione personalizzabile per i fornitori personalizzati (che consente ai dati nei parametri di essere qualsiasi cosa - spostandosi dove avviene la mappa). Questo però non esiste oggi.


Risposta popolare

Se vuoi davvero usare Dapper, puoi convertire SqlGeography in DbGeography:

DbGeography.FromText(sqlGeo.ToString());

Quindi basta fare la conversione in memoria, oppure puoi semplicemente usare SQL con EF:

dbContext.Fixes.SqlQuery("SELECT TOP(1) 
                                     f.FixID, 
                                     f.UserID, 
                                     f.Radius, 
                                     f.CreatedDate, 
                                     f.Position
                                     FROM [Fix] f 
                                     WHERE f.FixID = @fixId", new SqlParameter("fixId", fixId)).FirstOrDefault();

o semplicemente utilizzare Entity Framework nel modo normale? Dal momento che non è una query complicata :)

dbContext.Fixes.Find(fixId);

Sono ancora curioso di sapere perché si interroga con Dapper per mapparlo su Entities from EF



Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché
Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché