spatial - 您可以使用带有 NetTopologySuite 的实体框架 2.2 执行 Geometry 数据类型的 Sql Bulk Insert 吗?
问题描述
我正在使用 EF net core 2.2 和 NetTopologySuite 并尝试将一些属性数据与相关的几何数据合并。属性数据是文本文件格式,我可以很好地阅读。几何数据在它自己的表中,我可以从 MS-Sql 服务器读取它就好了。linq 连接工作正常,此过程在约 11 秒内完成。
相关的代码行是:
目标是将新创建的列表写回到 MS-Sql 中自己的表中,如果我遍历循环,则各个项目将写入表中(45 分钟后)。批量插入(使用 dataadapter 方法或 EFCore.Bulkinsert 方法都失败——它们似乎不想将几何类型放入表中。
// This starts the update process.
// Truncate the table (its faster).
Console.WriteLine("Beginning data update");
context.Database.ExecuteSqlCommand("Truncate table Tax_Parcels");
// context.BulkInsert(result); This is generating an error on insert from nettopologysuite
/*
* Also generates error on insert. I'm thinking bulk insert will have to wait to net core 3 releases ...
*
var objBulk = new BulkUploadToSql<Parcel>()
{
InternalStore = parcels,
TableName = "BOA_Staging",
CommitBatchSize = 10000,
ConnectionString = "Data Source=localhost;Initial catalog=<deleted>; UseTrustedConnection=True;"
};
objBulk.Commit();
*/
// standard add works, but takes 45 min to process records ><
int counter = 0;
int loop = 0;
foreach(var item in result)
{
context.Add(item);
counter++;
if (counter > 1000)
{
context.SaveChanges();
counter = 0;
loop++;
Console.WriteLine("I've added " + loop.ToString() + "000 Records so far");
}
}
Console.WriteLine("Done. I've added " + loop.ToString() + counter.ToString("{0,3}") + " Records.");
context.SaveChanges();
Console.WriteLine("Data update complete");
解决方案
解决方法:
- 为属性制作临时表并将文本文件数据加载到 SQL 表中。在导入过程中进行所需的任何转换。
- 创建一个视图以将具有几何字段的表连接到属性表。
- 创建一个组合视图表(如果您还没有)
- 创建一个存储过程,将视图中的数据插入到组合视图表中。
- 在更新程序中,使用
context.Database.ExecuteSql
截断临时表和组合视图表,对临时表运行更新以加载新数据,然后触发存储过程更新组合视图表。
统计:
- 使用
EF.Add()
- 45 分钟。 - 使用 45 秒以上的解决方法。
推荐阅读
- python - 使用python确定给定数据集的最佳k-mean
- sql - 如何在 SQL 中正确排序财政年度季度?
- c++ - 为什么我们不能将浮点值与某个数值进行比较
- laravel - 在 Laravel 共享主机上找不到驱动程序 (SQL: select * from `homes`)
- trimble-maps - “WEBGL JAVASCRIPT MAPS” React 中的集群
- jax-rs - 为什么我无法访问 JAX-RS api?
- reactjs - Bootstrap - 在 React 中创建列,同时呈现数据
- python - FFMPEG concat 在某些剪辑后切断音频
- c# - c# Can't Connecting with firebase 以及为什么 SetTaskAsync 使用当前代码返回空值
- junit - 在junit java测试期间使用mockito覆盖DNS查找