[POSTGRESQL İÇİN YENİ ÇÖZÜM] Hey, oldukça eski bir gönderi olduğunu biliyorum, ancak son zamanlarda benzer bir sorunla karşılaştım, ancak Postgresql kullanıyorduk. Oldukça zor olduğu ortaya çıkan etkili bulkinsert kullanmak istedim. Bu DB bunu yapmak için herhangi bir uygun ücretsiz kütüphane bulamadık. Sadece bu yardımcıyı buldum:
https://bytefish.de/blog/postgresql_bulk_insert/
ve aynı zamanda Nuget'te. Entity Framework şekilde otomatik eşlenen özellikleri küçük bir haritacı yazdım:
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;
}
Bunu şu şekilde kullanıyorum (Taahüt adlı bir varlığı vardı):
var undertakingHelper = BulkMapper.CreateHelper<Model.Undertaking>("dbo", nameof(Model.Undertaking));
undertakingHelper.SaveAll(transaction.UnderlyingTransaction.Connection as Npgsql.NpgsqlConnection, undertakingsToAdd));
İşlemle ilgili bir örnek gösterdim, ancak bağlamdan alınan normal bağlantı ile de yapılabilir. undertakingsToAdd, DB'ye bulkInsert yapmak istediğim normal varlık kayıtlarında numaralandırılabilir.
Birkaç saatlik araştırma ve denemeden sonra aldığım bu çözüm, çok daha hızlı ve nihayet kullanımı kolay ve ücretsiz olmasını beklediğiniz gibi! Bu çözümü sadece yukarıda belirtilen nedenlerle değil, aynı zamanda Postgresql'in kendisinde sorun yaşamadığım tek çözüm olduğu için kullanmanızı tavsiye ederim, diğer birçok çözüm örneğin SqlServer ile kusursuz çalışır.