另一个表中的 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 和外键的主要内容,如果未能解决你的问题,请参考以下文章
使用 ASP.NET 网站中的 File.CreateFile 将文件插入 Sql Server 2012 FileTable 时访问被拒绝