我尝试将FileTable与Entity Framework一起使用(我知道它不是直接支持的)。所以我使用自定义Sql命令来插入和删除(不更新)数据。我的问题是我有一个表,它使用FileTable的stream_id的外键引用FileTable。如果我插入FileTable,我怎样才能获得stream_id?
我想使用SqlBulkCopy插入大量文件,我可以批量插入到FileTable中,但是SqlBulkCopy不会告诉我插入的stream_id值。
如果我使用select scopeIdentity()或类似的东西执行单个插入语句,性能会变差。
我想将5.000个文件(2MB直到20MB)插入到FileTable中,并通过外键将它们与我自己的Table连接。这是不好的做法,我应该使用一个简单的路径列并将数据直接存储在文件系统中?我认为FileTable正在为我做这件事,因为我需要保护数据库,即使我过去一小时或四天回来,文件总是同步的。我无法完全同时备份数据库和文件系统,因此它们是100%同步的。
答案 0 :(得分:0)
我想使用SqlBulkCopy插入大量文件,我可以批量插入到FileTable中,但是SqlBulkCopy不会告诉我插入的stream_id值。
SqlBulkCopy不允许检索插入的标识值或任何其他值。
您可以在网上找到许多代码片段,以便使用SqlBulkCopy插入到临时表中。然后使用OUTPUT子句从临时表到目标表获取stream_id值。
这是一些步骤,但性能仍然非常好。
免责声明:我是该项目的所有者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);