我有一个工具,我写了将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;
中定义的DbGeometryforeach (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应用程序项目并尝试相同的事情,将在我拥有它们时提供结果。
答案 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>