Comment insérer DbGeography dans SQL Server à l'aide de dapper

c# dapper geospatial micro-orm sql-server

Question

J'ai créé le modèle en using System.Data.Entity.Spatial;

public class Store
{
    public int Id { get; private set; }
    public string Name { get; set; }
    public string Address { get; set; }
    public DbGeography Location { get; set; }
}

Insérer dans DB

using (SqlConnection conn = SqlHelper.GetOpenConnection())
{
    const string sql = "INSERT INTO Stores(Name, Address, Location) " + 
                       "VALUES (@Name, @Address, @Location)";
    return conn.Execute(sql, store);                                
}

j'obtiens le type System.Data.Entity.Spatial.DbGeography cannot be used as a parameter value exception type System.Data.Entity.Spatial.DbGeography cannot be used as a parameter value

Je l' ai essayé de chercher des moyens d'insérer, c'est le meilleur que je peux trouver, mais il essaie d'insérer seulement 1 paramètre, que dois - je faire afin d'insérer un objet qui a un membre de dbgeography?

Mise à jour n ° 1

J'ai cessé d'essayer de contourner ou d'étendre les choses, car je suis très novice et le temps n'est pas pour moi actuellement. Je suis revenu à la base en le faisant, car je ne suis pas obligé de faire très fréquemment une insertion de type de données géographiques

using (SqlConnection conn = SqlHelper.GetOpenConnection())
        {
            var sql = "INSERT INTO Stores (Name, Address, IsActive, Location, TenantId) " +
                      "VALUES('@Name', '@Address', @IsActive, geography::Point(@Lat,@Lng, 4326), @TenantId);";

            return conn.Execute(sql, new 
            { 
                Name = store.Name, 
                Address = store.Address, 
                IsActive = store.IsActive,
                Lat = store.Location.Latitude.Value,
                Lng = store.Location.Longitude.Value,
                TenantId = store.TenantId
            });             
        }

Réponse acceptée

L'ajout de la prise en charge directe pour les types en dehors des assemblages ADO.NET principaux est problématique, car il force beaucoup de réflexion basée sur le nom ou gonfle les dépendances (et provoque des problèmes de gestion des versions). Il n'est pas nécessaire (ou même approprié, IMO) d'utiliser IDynamicParameters ici - ICustomQueryParameter peut être utilisé pour représenter un seul paramètre. Il n'y a pas de détection de cas particulier de DbGeography , donc à moins qu'il y ait des modifications de bibliothèque , vous devez faire quelque chose comme:

return conn.Execute(sql, new {
    store.Name, store.Address, Location=store.Location.AsParameter()
});

AsParameter() est une méthode d'extension qui renvoie une implémentation ICustomQueryParameter qui l'ajoute de manière appropriée.


Edit: voir ici pour les mises à jour à ce sujet: https://stackoverflow.com/a/24408529/23354



Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi