現在のプロジェクトは、データ、ビジネス、プレゼンテーションの3つの標準レイヤーで構成されています。私はすべての自分のデータアクセスのニーズにデータエンティティを使用したいと思います。アプリの機能の一部は、フラットファイル内のすべてのデータをデータベースにコピーする必要があります。ファイルがそれほど大きくないので、SqlBulkCopyを使用できます。私は、.NETでSqlBulkCopyクラスの使用に関するいくつかの記事を見つけました。ただし、すべての記事でDataTableを使用してデータを前後に移動しています。
SqlBulkCopyと共にデータエンティティを使用する方法はありますか?それともDataTablesを使用する必要がありますか?
@DaveHogan答えの補足として、
DataTableの代わりにデータエンティティを使用して、Entity Frameworkのバルク挿入(SqlBulkCopyを使用)を実行できる新しいライブラリが追加されました。
免責事項 :私はEntity Framework Extensionsプロジェクトのオーナーです
このライブラリは無料ではありませんが、簡単に実行できます:
フードの下では、SqlBulkCopyが使用されます。拡張メソッドの使用makeは、使用するすべての一括挿入用のカスタムソリューションをコーディングするより簡単/高速です。
例
// Easy to use
context.BulkSaveChanges();
// Easy to customize
context.BulkSaveChanges(bulk => bulk.BatchSize = 100);
業績不振
パフォーマンスが低下してしまって申し訳ありません
JITコンパイルを忘れること、テストパフォーマンスに影響を与えるが、私たちのライブラリには関係しないAddRangeの代わりにAddを使用することなど、よくある間違いからの時間を含めないことを確認してください。
ほとんどの人は、一般的なパフォーマンスベンチマークの間違いをすべて除外した場合、25-50倍のパフォーマンス改善が得られると報告しています。
エンティティをIDataReaderまたはDataTableに変換する必要があります。
以下を支援するように設計された小さなヘルパークラスがあります。http : //archive.msdn.microsoft.com/LinqEntityDataReader/Release/ProjectReleases.aspx?ReleaseId=389
編集:msdnリンクが壊れている、altコピーはここで見つけることができます: https : //github.com/matthewschrager/Repository/blob/master/Repository.EntityFramework/EntityDataReader.cs
その後、SqlBulkCopyを以下のように使用することができます:
var sbCopy= new SqlBulkCopy(connectionString);
sbCopy.DestinationTableName = "TableName";
sbCopy.WriteToServer(entitiesList.AsDataReader());