[SOLUSI BARU UNTUK POSTGRESQL] Hei, saya tahu ini posting yang cukup lama, tapi saya baru saja mengalami masalah yang sama, tetapi kami menggunakan Postgresql. Saya ingin menggunakan bulkinsert yang efektif, yang ternyata cukup sulit. Saya belum menemukan perpustakaan gratis yang tepat untuk melakukannya pada DB ini. Saya hanya menemukan pembantu ini:
https://bytefish.de/blog/postgresql_bulk_insert/
yang juga ada di Nuget. Saya telah menulis mapper kecil, yang secara otomatis memetakan properti dengan cara Entity Framework:
public static PostgreSQLCopyHelper<T> CreateHelper<T>(string schemaName, string tableName)
{
var helper = new PostgreSQLCopyHelper<T>("dbo", "\"" + tableName + "\"");
var properties = typeof(T).GetProperties();
foreach(var prop in properties)
{
var type = prop.PropertyType;
if (Attribute.IsDefined(prop, typeof(KeyAttribute)) || Attribute.IsDefined(prop, typeof(ForeignKeyAttribute)))
continue;
switch (type)
{
case Type intType when intType == typeof(int) || intType == typeof(int?):
{
helper = helper.MapInteger("\"" + prop.Name + "\"", x => (int?)typeof(T).GetProperty(prop.Name).GetValue(x, null));
break;
}
case Type stringType when stringType == typeof(string):
{
helper = helper.MapText("\"" + prop.Name + "\"", x => (string)typeof(T).GetProperty(prop.Name).GetValue(x, null));
break;
}
case Type dateType when dateType == typeof(DateTime) || dateType == typeof(DateTime?):
{
helper = helper.MapTimeStamp("\"" + prop.Name + "\"", x => (DateTime?)typeof(T).GetProperty(prop.Name).GetValue(x, null));
break;
}
case Type decimalType when decimalType == typeof(decimal) || decimalType == typeof(decimal?):
{
helper = helper.MapMoney("\"" + prop.Name + "\"", x => (decimal?)typeof(T).GetProperty(prop.Name).GetValue(x, null));
break;
}
case Type doubleType when doubleType == typeof(double) || doubleType == typeof(double?):
{
helper = helper.MapDouble("\"" + prop.Name + "\"", x => (double?)typeof(T).GetProperty(prop.Name).GetValue(x, null));
break;
}
case Type floatType when floatType == typeof(float) || floatType == typeof(float?):
{
helper = helper.MapReal("\"" + prop.Name + "\"", x => (float?)typeof(T).GetProperty(prop.Name).GetValue(x, null));
break;
}
case Type guidType when guidType == typeof(Guid):
{
helper = helper.MapUUID("\"" + prop.Name + "\"", x => (Guid)typeof(T).GetProperty(prop.Name).GetValue(x, null));
break;
}
}
}
return helper;
}
Saya menggunakannya dengan cara berikut (Saya memiliki entitas bernama Undertaking):
var undertakingHelper = BulkMapper.CreateHelper<Model.Undertaking>("dbo", nameof(Model.Undertaking));
undertakingHelper.SaveAll(transaction.UnderlyingTransaction.Connection as Npgsql.NpgsqlConnection, undertakingsToAdd));
Saya menunjukkan contoh dengan transaksi, tetapi juga bisa dilakukan dengan koneksi normal yang diambil dari konteks. undertakingsToAdd adalah enumerable dari catatan entitas normal, yang ingin saya masukkan ke DB.
Solusi ini, yang saya dapatkan setelah beberapa jam meneliti dan mencoba, adalah seperti yang Anda harapkan jauh lebih cepat dan akhirnya mudah digunakan dan gratis! Saya benar-benar menyarankan Anda untuk menggunakan solusi ini, tidak hanya karena alasan yang disebutkan di atas, tetapi juga karena itu satu-satunya yang saya tidak punya masalah dengan Postgresql itu sendiri, banyak solusi lain bekerja dengan sempurna misalnya dengan SqlServer.