另一个表中的 FileTable 和外键

Posted

技术标签:

【中文标题】另一个表中的 FileTable 和外键【英文标题】:FileTable and Foreign Key from another table 【发布时间】:2018-01-02 15:56:38 【问题描述】:

我尝试将 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% 同步的。

【问题讨论】:

【参考方案1】:

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

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

解决方案 1

您可以在网上找到很多代码 sn-ps 以使用 SqlBulkCopy 插入到临时表中。然后从临时表到目标表使用OUTPUT子句获取stream_id值。

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

解决方案 2

免责声明:我是项目的所有者Entity Framework Extensions

免责声明:我是项目的所有者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);

【讨论】:

以上是关于另一个表中的 FileTable 和外键的主要内容,如果未能解决你的问题,请参考以下文章

SQL Server FileTable:删除文件

使用 ASP.NET 网站中的 File.CreateFile 将文件插入 Sql Server 2012 FileTable 时访问被拒绝

SQL Server 2012 FileTable 文件表

ASP.Net Core 2.0 FileTable 使用

做java项目时的主键和外键是啥啊?

如何从 SQL Server 文件表中的二进制数据中获取文件类型?