从对象类型Microsoft.SqlServer.Types.SqlGeometry到已知的托管提供程序本机类型

时间:2015-07-27 15:55:21

标签: c# sql-server entity-framework entity-framework-6 spatial

我有一个工具,我写了将shapefile数据导入我们的数据库。它使用EntityFramework 6.1.3和.NET 4.5。

然而,当我将相同的代码移动到我们现有的Web应用程序中以便在启动时为数据库播种时,它很有用,但它失败了:

"从对象类型Microsoft.SqlServer.Types.SqlGeometry到已知的托管提供程序本机类型不存在映射。"

Web应用程序也使用EF 6.1.3和.NET 4.5。包使用NuGet进行管理。我们正在使用DotSpatial库加载shapefile。

我正在使用System.Data.Entity.Spatial;

中定义的DbGeometry
foreach (IFeature feature in sf.Features)
{
    var wkt = feature.ToShape().ToGeometry().ToString();
    AdminDistrict ad = new AdminDistrict()
    {
        Id = Convert.ToInt64(feature.DataRow[fieldMap["Id"]]),
        ShortName = feature.DataRow[fieldMap["ShortName"]].ToString(),
        LongName = feature.DataRow[fieldMap["LongName"]].ToString(),
        Type = config.Type,
        Country = config.Country,
        Timestamp = DateTime.UtcNow,
        Geom = DbGeometry.FromText(wkt, 4326)
    };

    db.AdminDistricts.Add(ad);

}
db.SaveChanges();  //Exception is here...

我打算创造新的' Web应用程序项目并尝试相同的事情,将在我拥有它们时提供结果。

2 个答案:

答案 0 :(得分:0)

如果在未安装SQL Server的计算机上使用SQL Server Spatial类型,则需要在项目中包含以下NuGet包。

https://www.nuget.org/packages/Microsoft.SqlServer.Types

允许您在未安装SQL Server的计算机上使用SQL Server空间类型。部署到Windows Azure时很有用。还可以使用Entity Framework空间类型(DbGeography和DbGeometry)。

答案 1 :(得分:0)

找到一些旧的库引用,导致加载System.Data v2.0.0.0。我添加了一个新的assemblyBinding以确保它加载v4.0

<configuration>
    <runtime>
        <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
            <dependentAssembly>
                <assemblyIdentity name="System.Data" publicKeyToken="b77a5c561934e089" culture="neutral" />
                <bindingRedirect oldVersion="0.0.0.0-2.0.0.0" newVersion="4.0.0.0" />
            </dependentAssembly>
        </assemblyBinding>
    </runtime>
</configuration>