質問: Entity FrameworkでFileTableを使用しようとしています(直接サポートされていません)。だから私はカスタムSqlコマンドを使用してデータを挿入し、削除(更新なし)します。私の問題は、FileTableのstream_idに外部キーを持つFileTableを参照するテーブルがあることです。 FileTableに挿入すると、どうすればstream_idを取得できますか? SqlBulkCopyを使ってたくさんのファイルを挿入したいのですが、FileTableに一括挿入できますが、SqlBulkCopyは挿入されたstream_id値を教えてくれません。 select scopeIdentity()またはそれに類するものを含む単一のinsert文を実行すると、パフォーマンスが低下します。 私はFileTableに5.000ファイル(2MBから20MBまで)を挿入し、外部キーを介して自分のテーブルにそれらを接続したいと思います。この悪い習慣であり、私は単純なパスの列を使用し、ファイルシステムに直接データを格納する必要がありますか?私はFileTableが私のためにこれを正確にやっていると思っていました。なぜなら私はデータベースを保護する必要があり、過去に1時間か4日後にもファイルは常に同期しているからです。データベースとファイルシステムを正確に同時にバックアップすることはできませんので、100%同期します。
回答: > SqlBulkCopyを使ってたくさんのファイルを挿入したいのですが、FileTableに一括挿入できますが、SqlBulkCopyは挿入されたstream_id値を教えてくれません。 > > SqlBulkCopyは、挿入されたID値またはその他の値を取得することを許可していません。 解決策1 SqlBulkCopyを使用して、一時テーブルに挿入するコードスニペットをWeb上で多数見つけることができます。次に、OUTPUT句を使用して一時表から宛先表まで、stream_id値を取得します。 もう少しステップがありますが、パフォーマンスはまだ非常に優れています。 解決策2 **免責事項** :私はEntity Framework Extensionsプロジェクトのオーナーです **免責事項** :私はプロジェクトバルクオペレーションのオーナーです どちらのライブラリも無料ではありませんが、SqlBulkCopyの制限をより簡単に克服できます。 どちらもアイデンティティ値を出力することをサポートしています。 ``` // Easy to customize var bulk = new BulkOperation(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); ```