Die Spalte "SQL Geography" kann nicht mit Dapper der EF DbGeography-Klasse zugeordnet werden

c# dapper entity-framework sql sqlgeography

Frage

Ich habe Tabelle mit SQL Geographie Spalte in meiner SQL-Datenbank. Ich habe Entitäten für meine Datenbank mit EF6 generiert. Wie Sie wissen, generiert Entity Framework System.Data.Entity.Spatial.DbGeography für den SQL-Geographietyp. Ich verwende Dapper, um Abfragen auszuführen und die Ergebnisse in meine EF-generierten Entitäten zu mappen.

Meine Entitätsklasse

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

SQL-Abfrage, die eine Ausnahme auslöst

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

Hier ist ein Ausnahme-Snapshot

Bildbeschreibung hier eingeben

Ich denke standardmäßig versucht Dapper, Microsoft.SqlServer.Types.SqlGeography zuzuordnen.

Gibt es hier einen Workaround?

BEARBEITET

Ich habe eine Lösung gefunden, eine Teilklasse für meine Entität erstellt

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

Und meine Abfrage geändert

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

Expertenantwort

Dapper unterstützt viele gängige Datentypen, aber nicht alle. Sie könnten einen benutzerdefinierten Abfrageparameter verwenden - Sie können sehen, wie aus diesem Commit die benutzerdefinierte Unterstützung für Tabellenwerte als DataTable . Ich würde sehr zögern, etwas hinzuzufügen, das zusätzliche Abhängigkeiten erfordert, besonders für Dinge wie EF. Was vielleicht in der Zukunft nützlich sein könnte, ist ein anpassbares Registrierungstool für benutzerdefinierte Anbieter (das erlaubt, dass die Daten in den Parametern alles sein können - Bewegen, wo die Karte passiert). Das gibt es heute aber nicht.


Beliebte Antwort

Wenn Sie Dapper wirklich verwenden möchten, können Sie SqlGeography in DbGeography konvertieren:

DbGeography.FromText(sqlGeo.ToString());

Mach einfach die Konvertierung im Speicher, oder du kannst auch einfach SQL mit EF verwenden:

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

oder verwenden Sie einfach Entity Framework auf die normale Art und Weise? Da es keine komplizierte Abfrage ist :)

dbContext.Fixes.Find(fixId);

Ich bin immer noch neugierig, warum Sie mit Dapper abfragen, um es dann auf Entitäten von EF abzubilden



Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow