Мой текущий проект состоит из 3 стандартных слоев: данных, бизнеса и презентации. Я хотел бы использовать объекты данных для всех моих потребностей в доступе к данным. Часть функциональности приложения будет заключаться в том, что ему нужно будет скопировать все данные в плоском файле в базу данных. Файл не такой большой, поэтому я могу использовать SqlBulkCopy. Я нашел несколько статей, посвященных использованию класса SqlBulkCopy в .NET. Тем не менее, все статьи используют DataTables для перемещения данных взад и вперед.
Есть ли способ использовать объекты данных вместе с SqlBulkCopy или мне придется использовать DataTables?
В качестве дополнения к ответу @DaveHogan,
Теперь есть новые библиотеки, которые позволяют выполнять Bulk Insert (используя SqlBulkCopy под капотом) для Entity Framework с использованием сущностей данных вместо DataTable.
Отказ от ответственности : Я являюсь владельцем проекта Entity Framework Extensions
Эта библиотека не является бесплатной, но позволяет легко выполнять:
Под капотом используется SqlBulkCopy. Использование метода расширения упрощает / ускоряет процесс кодирования пользовательского решения для каждой используемой массовой вставки.
пример
// Easy to use
context.BulkSaveChanges();
// Easy to customize
context.BulkSaveChanges(bulk => bulk.BatchSize = 100);
низкая производительность
Мне жаль, что вы плохо себя чувствуете,
Убедитесь, что вы не включаете время от какой-либо распространенной ошибки, например, забываете использовать JIT Compile, используя Add вместо AddRange, которые влияют на производительность теста, но не связаны с нашей библиотекой.
Большинство людей сообщают о повышении производительности в 25-50 раз, исключая все распространенные ошибки производительности.
Вам нужно будет преобразовать объекты в IDataReader или DataTable.
Существует небольшой вспомогательный класс, предназначенный для помощи с: http://archive.msdn.microsoft.com/LinqEntityDataReader/Release/ProjectReleases.aspx?ReleaseId=389
EDIT: ссылка msdn нарушена, alt copy можно найти здесь: https://github.com/matthewschrager/Repository/blob/master/Repository.EntityFramework/EntityDataReader.cs
Тогда вы можете использовать SqlBulkCopy следующим образом:
var sbCopy= new SqlBulkCopy(connectionString);
sbCopy.DestinationTableName = "TableName";
sbCopy.WriteToServer(entitiesList.AsDataReader());