首页 > 解决方案 > 您可以使用带有 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");

标签: spatialbulkinsertentity-framework-core-2.2

解决方案


解决方法:

  1. 为属性制作临时表并将文本文件数据加载到 SQL 表中。在导入过程中进行所需的任何转换。
  2. 创建一个视图以将具有几何字段的表连接到属性表。
  3. 创建一个组合视图表(如果您还没有)
  4. 创建一个存储过程,将视图中的数据插入到组合视图表中。
  5. 在更新程序中,使用context.Database.ExecuteSql截断临时表和组合视图表,对临时表运行更新以加载新数据,然后触发存储过程更新组合视图表。

统计:

  • 使用EF.Add()- 45 分钟。
  • 使用 45 秒以上的解决方法。

推荐阅读