فرض کنید دارید در پروژه، از Entity Frameworkاستفاده میکنید و یک مدل با نام Personدارید که تعریفش به صورت زیر است
public class Person { public int PersonId { get; set; } public string Name { get; set; } }
حالا میخوایم تعداد ٥٠٠٠ رکورد از Personرو یکجا وارد دیتابیس کنیم. برای استفاده از SqlBulkCopy، روش به این شکل هست که ابتدا یکDataTable ایجاد میکنیم. سپس ستونهای متناظر با جدول Personرو با استفاده از DataColumnایجاد میکنیم و DataColumnهای ایجاد شده رو به DataTableاضافه میکنیم و سپس اطلاعات رو وارد DataTableمیکنیم و اون رو با استفاده از SqlBulkCopyوارد دیتابیس میکنیم که این روش یکم وقتگیر و خسته کننده است.
راه آسانتر استفاده از یک کتابخانه با نام EntityDataReaderهست که توسط مایکروسافت نوشته شده که دیگه نیازی به ساختنDataTable نیست و این کتابخانه کارهای لازم رو خودش انجام میده. در پروژەتون یک کلاس با نامEntityDataReaderایجاد کنید و سورس مربوط این کلاس رو از اینجا copy و در داخل کلاس paste کنید.
حالا یک لیست از Pesronبا نام personListایجاد مینماییم و با استفاده از یک حلقه تعداد ٥٠٠٠ تا نمونه از Person ایجاد و به لیست اضافه میکنیم.
var personList = new List<Person>(); for (var i = 0; i < 5000; i++) { var person = new Person { Name = "John Doe", }; }
در ادامه برای استفاده از SqlBulkCopyنیاز به ConnectionStringو نام جدول متناظر با کلاس Personدر دیتابیس داریم.
اگر از پروژ وب استفاده میکنید میتونید با این خط کد ConnectionString رو که در فایل web.config ذخیره شده است بروگردونید که در اینجا DataConnection نام ConnectionString ذخیره شده در web.config هست.
var connectionString = ConfigurationManager.ConnectionStrings["DataConnection"].ConnectionString;
اگر از EF Code First استفاده میکنید و در تنظیمات Context خاصیت PluralizingTableNameConvention رو حذف کردیدەاید نام جدول dbo.Person هست و در غیر اینصورت db.Persons هست.
و در ادامه داریم:
var connectionString = ConfigurationManager.ConnectionStrings["DataConnection"].ConnectionString; var bulkCopy = new SqlBulkCopy(connectionString) { DestinationTableName = "dbo.Person" }; bulkCopy.WriteToServer(personList.AsDataReader() );
سرعت این روش بسیار بالاست و برای درجهای با تعداد بالا بهینه است.
برای ویرایش و حذف چندین رکورد بصورت همزمان متیونید از کتابخانه Entity Framework Extended Library استفاده کنید که امکانات دیگری هم داره و از طریق nuget هم قابل نصب است.