1

我尝试将 FileTable 与 Entity Framework 一起使用(我知道它不被直接支持)。所以我使用自定义 Sql 命令来插入和删除(不更新)数据。我的问题是我有一个表,它使用 FileTable 的 stream_id 的外键引用 FileTable。如果我插入到 FileTable 中,如何取回 stream_id?

我想使用 SqlBulkCopy 插入大量文件,我可以批量插入 FileTable,但 SqlBulkCopy 不会告诉我插入的 stream_id 值。

如果我使用 select scopeIdentity() 或类似的东西执行单个插入语句,性能会变得更糟。

我想将 5.000 个文件(2MB 到 20MB)插入到 FileTable 中,并通过外键将它们与我自己的表连接起来。这是不好的做法,我应该使用简单的路径列并将数据直接存储在文件系统中吗?我认为 FileTable 正是为我做这件事,因为我需要保护数据库并且文件总是同步的,即使我过去一小时或四天。我不能同时备份数据库和文件系统,所以它们是 100% 同步的。

4

1 回答 1

0

我想使用 SqlBulkCopy 插入大量文件,我可以批量插入 FileTable,但 SqlBulkCopy 不会告诉我插入的 stream_id 值。

SqlBulkCopy 不允许检索插入的标识值或任何其他值。

解决方案 1

您可以在 Web 上找到许多代码片段,以使用 SqlBulkCopy 将其插入到临时表中。然后从临时表到目标表使用 OUTPUT 子句获取 stream_id 值。

再走几步,性能还是很不错的。

解决方案 2

免责声明:我是实体框架扩展项目的所有者

免责声明:我是Bulk Operations项目的所有者

这两个库都不是免费的,但可以更轻松地克服 SqlBulkCopy 限制。

它们都支持输出标识值。

// Easy to customize
var bulk = new BulkOperation<Customer>(connection);
bulk.BatchSize = 1000;
bulk.ColumnInputExpression = c => new { c.Name,  c.FirstName };
bulk.ColumnOutputExpression = c => c.CustomerID;
bulk.ColumnPrimaryKeyExpression = c => c.Code;
bulk.BulkMerge(customers);

// Easy to use
var bulk = new BulkOperation(connection);
bulk.BulkInsert(dt);
bulk.BulkUpdate(dt);
bulk.BulkDelete(dt);
bulk.BulkMerge(dt);
于 2017-07-27T12:58:26.980 回答